你的位置:首页 > 软件开发 > 操作系统 > Android线程间异步通信机制源码分析

Android线程间异步通信机制源码分析

发布时间:2015-08-23 18:00:14
本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务。文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究。基础架构 首先,我们需要从整体架构上了解一下 ...

        本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务。文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究。

基础架构

        首先,我们需要从整体架构上了解一下Android线程通信都做了哪些工作。我们都知道,进程是操作系统分配资源的最小单位,一个进程中可以启动多个线程来执行任务,这些线程可以共享进程的资源但不分配资源,这里讲的资源主要是只内存资源。Android的线程间消息传递机制其实和我们现实生活人们通信中很相似,我们可以类比一下两个人的通信过程:假设A要给B写信,首先将信写好装入信封(Message),交给B的邮递员(handler)投入B的信箱(messageQueue)中,B的管家(looper)发现有信件需要查收,就交给B来处理。下图是其余线程向主线程发送消息的示意图:

Android线程间异步通信机制源码分析

    整个过程如下:

  1. 子线程通过主线程的handler发送一条消息给主线程;
  2. 这条线程被放入主线程的消息队列中;
  3. 整个消息队列是由looper来创建和管理的,通过轮询一旦发现有新消息存在就取出交给主线程处理。

组件源码分析

        了解过整个架构之后,我们就从源码的角度体会一下Android线程之间通信机制的精妙设计吧。

信封message

        Message类作为发送给handler的消息,其中封装了一份对于消息的描述以及需要传递的数据对象。关于消息回收机制我们放在后面的文章中介绍,这里先只把它当作封装了要传递数据的消息类。首先,两个int成员变量和一个obj对象用于存储被传递的数据:

    • what: 用户自定义的消息码,用于消息接收者识别该消息的类型。
    • arg1、arg2: 如果只传递int值,可以采用这两个参数存储。
    • obj : 可以存放需要传递的数据对象。

        还有一些成员变量也需要简单了解一下:

    • int flags : 该消息是否正在被取用
    • long when : 时间戳
    • Bundle data : 要传递的数据
    • Handler target : 指定处理该消息的目标handler.
    • Runnable callback :也可以指定处理该消息的回调函数
    • message next: 指向下一个message,后面介绍messageQueue时再详细介绍。

 

        通过obtain方法可以获取一条message对象使用(工厂模式):

public static Message obtain() {    synchronized (sPoolSync) {      if (sPool != null) {        Message m = sPool;        sPool = m.next;        m.next = null;        m.flags = 0; // clear in-use flag        sPoolSize--;        return m;      }    }    return new Message();  }

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:Android线程间异步通信机制源码分析

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录