在系列视频的二三四讲中讲了搭建主框架中的UI层(主要为微博中的各个窗体)和Logic层(程序的核心控制调度模块,获取UI传递的数据、要执行的任务,调用微博接口,获得网络数据,返回消息,刷新(切换)UI)。
Eclipse中代码结构如下图:
Logic层的Mainservice
1、完成程序调度 接收任务,完成业务逻辑,返回信息,更新UI
2、在后台运行(继承自Service类)
3、线程(实现Runnable接口) 不断侦听UI传过来任务消息
流程关系如图:
MainService代码如下:
package haiyang.project.iweibo.logic;
import haiyang.project.iweibo.bean.Task;
import haiyang.project.iweibo.ui.IWeiboActivity;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import android.app.Activity;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
public class MainService extends Service implements Runnable {
//任务队列
private static Queue<Task> tasks=new LinkedList<Task>();
private static ArrayList<Activity> appActivities=new ArrayList<Activity>();
private boolean isRun;//是否运行线程
Handler handler=new Handler(){
public void handleMessage(android.os.Message msg){
switch (msg.what) {
case Task.WEIBO_LOGIN://用户登录
//更新UI
IWeiboActivity activity=(IWeiboActivity) getActivityByName("LoginActivity");
activity.refresh(msg.obj);
break;
default:
break;
}
};
};
/*
* 添加一个Activity对象
*/
public static void addActivity(Activity activity){
appActivities.add(activity);
}
/**
* 根据Activity的Name获取Activity对象
* @param name
* @return
*/
private Activity getActivityByName(String name){
if(!appActivities.isEmpty()){
for(Activity activity:appActivities){
if(activity!=null){
if(activity.getClass().getName().indexOf(name)>0){
return activity;
}
}
}
}
return null;
}
/*
* 添加任务到任务队列中
*/
public static void newTask(Task t){
tasks.add(t);
}
@Override
public void onCreate() {
isRun=true;
Thread thread=new Thread(this);
thread.start();
super.onCreate();
}
public void run() {
while(isRun){
Task task=null;
if(!tasks.isEmpty()){
task=tasks.poll();//执行完任务后把该任务从队列中移出(否则会一直循环)
if(task!=null){
doTask(task);
}
}
try {
Thread.sleep(1000);//执行完任务后休息一秒钟
} catch (Exception e) {
}
}
}
/*
* 处理任务,发回更新消息给主线程
*/
private void doTask(Task t){
Message msg=handler.obtainMessage();
msg.what=t.getTaskId();
switch(t.getTaskId()){
case Task.WEIBO_LOGIN:
System.out.println("doTask >>>>>>> user login");
msg.obj="登录成功";
break;
default:
break;
}
handler.sendMessage(msg);
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
Logic层的Task 程序中的任务
package haiyang.project.iweibo.bean;
import java.util.*;
public class Task {
//任务Id
private int taskId;
//参数
private Map<String,Object> tasKParams;
//登录
public static final int WEIBO_LOGIN=1;
public Task(int taskId,Map<String,Object> taskParams){
this.taskId=taskId;
this.tasKParams=taskParams;
}
public int getTaskId() {
return taskId;
}
public void setTaskId(int taskId) {
this.taskId = taskId;
}
public Map<String, Object> getTasKParams() {
return tasKParams;
}
public void setTasKParams(Map<String, Object> tasKParams) {
this.tasKParams = tasKParams;
}
}
IWeiboActivity
所有的Activity都实现它
init() 初始化数据
refresh()刷新UI
package haiyang.project.iweibo.ui;
/*
* Activity接口
*/
public interface IWeiboActivity {
/*
* 初始化数据
*/
void init();
/*
* 刷新UI
*/
void refresh(Object... params);
}
此代码实现了由Logo界面到登录的过程,LoginActivity在前面的基础上有变化
package haiyang.project.iweibo.ui;
import haiyang.project.iweibo.R;
import haiyang.project.iweibo.bean.Task;
import haiyang.project.iweibo.logic.MainService;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class LoginActivity extends Activity implements IWeiboActivity{
private Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
//启动服务
Intent intent=new Intent(this,MainService.class);
startService(intent);
btnLogin=(Button) this.findViewById(R.id.btn_login);
btnLogin.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Task task=new Task(Task.WEIBO_LOGIN,null);
MainService.newTask(task);
}
});
//把自己放到Activity集合里面
MainService.addActivity(this);
}
public void init() {
}
public void refresh(Object... params) {
TextView txtResult=(TextView) this.findViewById(R.id.txt_result);
txtResult.setText(params[0].toString());
}
}
此外还需更改布局文件main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/txt_result"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Test ADD Method" />
<Button android:id="@+id/btn_login"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="get"/>
</LinearLayout>
对了,补充一个小问题,由于此视频讲解者是在用的SDK2.2,如果你的SDK版本高于2.2,且要运行视频中打包的代码时,即android api level由上向下兼容时,要修改一个参数,才能使在较低SDK版本下编写的代码在高版本上编译运行,具体做法:把project.properties最后一行target=android-i 中的i修改为你所用的版本平台。
嘿嘿,各位写代码也有点累了吧,特别是深夜的时候是不是觉得应该有点吃的就更好了?可以到本人开
的小店“小灰灰休闲美食”店买点休闲食品哦,既满足食欲又可以放松哈子,当然平时也要吃是吧,也
可以买来送朋友哦!