Handler的绑定过程
来源:互联网 发布:象棋软件哪个厉害 编辑:程序博客网 时间:2024/06/06 18:13
研究了一下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()也会退出死循环
- Handler的绑定过程
- Handler机制的过程
- Service的绑定过程
- handler method 参数绑定常用的注解
- Android Service的绑定过程
- Android Service的绑定过程
- Springmvc的handler method参数绑定常用的注解
- 使用Handler异步处理的内部过程
- Handler 的运行过程和作用
- Handler使用过程中出现的问题
- 创建Handler时,绑定到(指定线程的)消息循环
- 注解学习笔记-handler method 参数绑定常用的注解
- Handler和Looper是怎样绑定到一起的?
- handler method 参数绑定常用的注解详解
- Handler过程剖析-傻瓜都能看懂的过程图
- Tomcat绑定二级域名的配置过程
- DataGridView 数据绑定的一般过程
- 分析Activity的View绑定过程
- 第3周项目3——求集合并集
- Android开源控件----Android显示GIF图像控件------android-gif-drawable
- HDU 2095 find your present (2)
- 【JDBC】day03_数据库连接池
- sublime text 2/3支持中文编码
- Handler的绑定过程
- 9.19 third day 注意事项
- HTML中的文本控制
- Android AIDL技术详解
- 设计模式的认识
- Android内存管理机制详解
- docker学习笔记(一)
- Android Api Demos登顶之路(七十六)Graphics-->ShapeDrawable
- 面试