【一找客户端】针对异步逻辑的封装

前一段时间在网上找到了一份开源项目: 一找网(www.yeezhao.com)。 这是个电子商务网站,这两天研究它的android客户端。

整体来看这个项目的代码写的还是非常棒的、非常清晰。有许多可以借鉴的地方。

先来个图片,让我们感受一下这个软件的软件架构

action里面的内容为封装的一些动作信息。比较复杂的逻辑。

activity为界面信息。

adapter为程序中使用到的适配器

bean为对数据的封装。

blog为牵扯的微博信息。

core为一些框架的基础类。提供的几大功能的核心类。

ui为扩展的UI类。

util中包含了所需要的客户端信息。

从上面可以看出,整个程序的代码结构还是很清晰的。介绍我这个代码结构,后面就要说本篇文章的重点: 针对异步逻辑的封装。

首先上一张异步逻辑的类图:  

看到这个类图之前,你需要一些基础知识:对android的Ihandler机制有个初步了解

图中显示出:AsyncWorkHandler和WorkerHandler均实现了Handler接口。 那么他们有什么区别呢?

  • AsyncWorkHandler为绑定在主线程(UI线程)中的Handler,他处理的是其他线程抛到主线程中的消息;
  • WorkerHandler为绑定在子线程中的Handler,他处理的为抛到子线程中的消息;

WorkerArgs为一个Message的参数。这个Message是用于UI线程发送到子线程的消息数据封装。

下图为整个执行流程:

好了,看了上面的流程,下面就要帖代码了。 安装流程的先后顺序帖代码。

1。 new AsyncworkHandler()的构造方法

 public AsyncWorkHandler(){

//由于这里的sLooper为static,所以这里的同步快为.class对象。
synchronized (AsyncQueryHandler.class) {
if (sLooper == null) {
//只启动一个子线程。该子线程中可以设置多个Handler。
HandlerThread thread = new HandlerThread("AsyncWorkHandler");
thread.start();
sLooper = thread.getLooper();
}
}
//每个异步任务实例,配置一个新的子线程Handler
mWorkerHanler = new WorkerHandler(sLooper);
}


2。 主线程中调用的doWorker(Map<String,String> map)方法

    public void doWork(Map<String,String> map){
//向子线程中发送消息
Message msg = mWorkerHanler.obtainMessage();
//消息中封装主线程Handle信息和子线程所需的业务参数
WorkerArgs workArgs = new WorkerArgs();
workArgs.handler = this;
workArgs.map = map;
msg.obj = workArgs;
mWorkerHanler.sendMessage(msg);
}

3。 子线程中的mWorkerHandler处理主线程发送来的消息

 //子线程消息处理器处理来自主线程中的数据
@Override
public void handleMessage(Message msg) {

WorkerArgs args = (WorkerArgs) msg.obj;

Map<String,String> quest_map = args.map; //业务参数

//子线程根据业务参数quest_map执行execute逻辑。execute需要我们来覆写。
Object obj = excute(quest_map);

//这个handler为之前传入的主线程Handler。 向主线程发送消息
Message result = args.handler.obtainMessage();

result.obj = obj;

result.sendToTarget();//发送消息至目标
}


4。AsyncworkHandler中的handleMessage(Message msg)处理来自子线程的反馈内容。 这里需要覆写。

原理就是上面的内容。 根据这种设计,我们要使用该设计来进行应用程序的编写,就简单了许多

                   AsyncWorkHandler as = new AsyncWorkHandler(){
//子线程中所需要执行的逻辑
@Override
public Object excute(Map<String, String> map) {
// TODO Auto-generated method stub
return super.excute(map);
}

//主线程需要处理的子线程的返回消息
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}


};
//设置execute中执行所需要的参数。
Map<String,String> params = new HashMap<String,String>();
params.put("n",keyworld);

as.doWork(params);//开始执行



最后,上传整个【一找客户端】工程代码。 注意观察那么几个类 AsyncWorkHandler。

原文地址:https://www.cnblogs.com/xitang/p/2184452.html