zoukankan      html  css  js  c++  java
  • 【一找客户端】针对异步逻辑的封装

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

  • 相关阅读:
    C++函数声明与定义
    《寻找发帖“水王”》代码的理解
    将正整数转换为二进制数
    使用Cookie记住登录用户
    Java组合算法
    已知链表头结点指针head,写一个函数把这个链表逆序
    String.IsNullOrEmpty官方示例
    log4net的使用
    asp.net MVC4总结
    点击获取页面上的经纬度
  • 原文地址:https://www.cnblogs.com/xitang/p/2184452.html
Copyright © 2011-2022 走看看