原文出自:方杰| http://fangjie.sinaapp.com/?p=62 转载请注明出处

该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo

提前声明的是,我是依照Ivan的这套教程学下来的。

首先,对于不论什么应用我们都须要建立一套消息处理机制,就是当用户在UI界面上点击了什么。你应该做出什么样的处理,处理完毕之后又要将结果 反馈给用户。显示在UI界面上。简而言之:主框架在这里主要是搭建起一个异步消息处理机制,UI线程中发送消息,service处理消息。处理完了调用UI线程实例更新UI界面。

先看看这里是怎么处理的,例如以下图:



解析:在程序启动时开启MainService。MainService中新开个线程来不断循环的监听Tasks中是否有任务。

当UI界面的主线程接收到用户的某个操作时。就会调用MainService.newTask()将这个任务放进Tasks中。而且把Activity放进Activities。

这样在MainService中的第二线程就会监听到这个任务,就会调用MainService.doTask(),当做完处理后MainService第二线程就会向MainService主线程发送Handler消息,将处理得一些数据发送到Acitivity中,然后调用的Activity.refresh()就能刷新页面了。这里要强调的是UI层的Activity都要实现IWeiboActivity这样一个接口。实现他的refresh(),init()两个抽象方法。

MainService.java

package com.fangjie.weibo.logic;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
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;
import android.util.Log;
import com.fangjie.weibo.bean.*;
import com.fangjie.weibo.db.DBUserInfo;
import com.fangjie.weibo.ui.IWeiboAcitivity;
import com.fangjie.weibo.util.GetUserInfo;
import com.weibo.sdk.android.Oauth2AccessToken; 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;
private Handler handler; @Override
public void onCreate() {
// TODO Auto-generated method stub
/**
* 在MainService中开启第二线程来处理任务
* 主要是不断监听Tasks堆栈,从Tasks中处理task
*/
isRun=true;
Thread thread =new Thread(this);
thread.start();
super.onCreate(); /**
* 主要是获取从MainService第二线程(doTask)中获取处理完任务的数据
* 并通知更新UI界面
*/
handler =new Handler(){
public void handleMessage(Message msg)
{
IWeiboAcitivity activity=null;
switch(msg.what)
{
case Task.WEIBO_LOGIN:
activity=(IWeiboAcitivity)getActivityByName("LoginActivity");
activity.refresh(Task.WEIBO_LOGIN,msg.obj);
break;
case Task.GET_USERINFO_BY_TOKEN: break; case Task.GET_USERINFO_IN_LOGIN: break;
default:
break;
}
}
}; } @Override
public void run() {
// TODO Auto-generated method stub
while(isRun)
{
if(!tasks.isEmpty())
{
doTask(tasks.poll());
}
}
} /**
* UI层向MainService中发送任务task
* UI层调用,所以static
* @param task
*/
public static void newTask(Task task)
{
tasks.add(task);
} /**
* UI层向MainService中发送任务的同一时候。相同要发送自己Activity,
* 以便在MainService中调用refresh();
* @param task
*/
public static void addActivty(Activity activity)
{
appActivities.add(activity);
}
/**
* UI层中有向MainService中传递Activity,在任务结束后(refresh)。应去除该Activity,防止混淆! * @param activity
*/
public static void reMoveActivty(Activity activity)
{
appActivities.remove(activity);
} /**
* 通过name获取新开任务时传递过来的Activity实例
* @param name
* @return
*/
public Activity getActivityByName(String name)
{
if(!appActivities.isEmpty())
{
for(Activity activity:appActivities)
{
if(activity.getClass().getName().indexOf(name)>0)
{
return activity;
}
}
}
return null;
} /**
* 处理Tasks堆栈中的task
* @param task
*/
public void doTask(Task task)
{
Message msg=handler.obtainMessage();
msg.what=task.getTaskID(); switch(task.getTaskID())
{
//登录操作
case Task.WEIBO_LOGIN:
System.out.println("login successful");
msg.obj="登录成功";
break; //通过access_token获取用户信息,并保存到数据库操作
case Task.GET_USERINFO_BY_TOKEN:
msg.obj="成功";
break; //登录界面获取用户信息显示操作
case Task.GET_USERINFO_IN_LOGIN:
msg.obj="成功";
break;
default :
break;
}
handler.sendMessage(msg);
} @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}

再看看我的project文件架构,例如以下图:

Task.java是任务的实体类,包括任务的ID。任务的參数成员变量,IWeiboActivity就是全部Activity要实现的接口。

 欢迎各位关注我的个人网站:http://fangjie.sinaapp.com/ 

最新文章

  1. OkHttp 3.4入门
  2. Eclipse在线安装SVN
  3. Spring事务注解@Transactional回滚问题
  4. webpack echarts配置实例
  5. js 获取时间对象代码
  6. (转)iOS7界面设计规范(3) - UI基础 - 启动与退出
  7. Android之一个简单计算器源代码
  8. android 瀑布流效果(仿蘑菇街)
  9. CSS基础用法
  10. java开发网易电话面试 一面总结
  11. 报表开发之扩展GROUP BY
  12. NumPy入门
  13. idea热部署
  14. Canvas实现3D效果-可旋转的立方体
  15. 我们一起来排序——使用Java语言优雅地实现常用排序算法
  16. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储模式
  17. simulink创建简单模型
  18. 通过游戏来学习CSS的Flex布局
  19. jqGrid之treeGrid及行拖拽
  20. Druid监控页面配置与使用

热门文章

  1. 修改SVN路径
  2. MSSQL纵列转横列
  3. JDBC二部曲之_事物、连接池
  4. Python与数据结构[1] -&gt; 栈/Stack[1] -&gt; 中缀表达式与后缀表达式的转换和计算
  5. Python的程序结构[2] -&gt; 类/Class[0] -&gt; 类的特殊属性
  6. POJ 2155 Matrix(树状数组+容斥原理)
  7. linux 服务器信息查看
  8. SQL Server 2017 EXPRESS 安装 SQLCMD 设置远程连接
  9. SqlServer发布订阅错误收集
  10. 设计模式之过滤器模式(php实现)