Handler的绑定过程
2015-09-20 15:11
204 查看
研究了一下Handler的源码,总结其绑定线程及创建消息队列的过程如下:
Looper绑定线程的过程:(以下截图都是源码截图)以下图为例:
在Looper.prepare()方法中,创建Looper对象和消息队列,绑定线程,并创建Values集合,以便handler获取到looper对象
sThreadLocal.set(new Looper(quitAllowed))是ThreadLocal类(可用当前线程创建一个线程副本的一个类)的方法,其中的new Looper(quitAllowed)不难看出,Looper绑定消息队列的过程(很简单,mQueue是Looper的属性),Looper绑定线程的过程(也很简单,mThread是Looper的属性)。
新建Looper对象的时候,就创建了mQueue ,方便此后的sThreadLocal.set()的执行;
其中Values是一个Map集合,是ThreadLocal的一个内部类,即把当前ThreadLocal对象作为key,value(Looper对象)作为值,添加到Values集合中,
Looper绑定了线程和消息队列,那么久还差Handler没绑定了。
在Looper.prepare()方法后面紧接着创建Handler对象,利用空构造方法,以内部类的形式创建handler对象,
在空的构造方法里,有调用了有两个参数的构造方法,即下图的方法
其中又调用了mLooper = Looper.myLooper();方法来获取looper对象,
在myLooper()方法中又调用了ThreadLocal 的get()方法,看return就行,
有调用values.getAfterMiss(this),如下图
从Values集合中获取了Looper对象,这样就实现了线程的绑定。
下面是消息读取原理
由下图不难看出,Message msg = queue.next();获取消息的语句被放在for(;;)死循环里,这就意味着它不停地获取消息,而MessageQueue的next(),如果读到null岂不是会退出死循环?
必须是!但请再看看这个next()方法,不难看出next()也是一个for(;;)死循环,
而只有读到的msg不为空时才跳出循环,如下图
还有一种情况,当进程(不是线程)退出时,next()也会退出死循环
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories