本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务。文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究。基础架构 首先,我们需要从整体架构上了解一下 ...
本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务。文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究。
基础架构
首先,我们需要从整体架构上了解一下Android线程通信都做了哪些工作。我们都知道,进程是操作系统分配资源的最小单位,一个进程中可以启动多个线程来执行任务,这些线程可以共享进程的资源但不分配资源,这里讲的资源主要是只内存资源。Android的线程间消息传递机制其实和我们现实生活人们通信中很相似,我们可以类比一下两个人的通信过程:假设A要给B写信,首先将信写好装入信封(Message),交给B的邮递员(handler)投入B的信箱(messageQueue)中,B的管家(looper)发现有信件需要查收,就交给B来处理。下图是其余线程向主线程发送消息的示意图:
整个过程如下:
- 子线程通过主线程的handler发送一条消息给主线程;
- 这条线程被放入主线程的消息队列中;
- 整个消息队列是由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
(#换成@)。