前一段时间在网上找到了一份开源项目: 一找网(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。