专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 移动开发

过程(一) 1.7 Handler的源码解析

发布时间:2010-05-30 05:31:37 文章来源:www.iduyao.cn 采编人员:星星草
进程(一) 1.7 Handler的源码解析


先说下handler的三个构造函数开始我们的源码解析之旅吧。。。

(一)默认的构造函数


其中, MessageQueue mQueue存放消息的消息队列,Looper mLooper消息循环,Callback mCallback回调;

看下代码 mLooper = Looper.myLooper(); 

这里我们看下Looper的源码:




而这里的static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();

发现在myLooper() 中得到的函数在prepare函数加入了消息循环的sThreadLocal.set(new Looper());

这里很好的说明了,我们在使用mylooper()的时候,需要先调用prepare()方法。

2. CallBack回调函数


这个构造函数与默认构造函数唯一不同的就是mCallback区别,那我们就分析CallBack这个接口吧!

这个其实就是在消息派发的时候,区分是在哪里处理消息的,如果Callback不为空,则消息就在他实现的这个借口的handleMessage()方法里处理。

3. 传入消息循环Looper


这个是传入消息循环,而不是系统默认生成,而是我们自己创建或者从已有的消息循环拿过来使用


4.消息循环和CallBack回调函数



(二)消息的发送

handler如何把消息放入消息队列中吗?runable中的run()是如何被调用的????

1. 发送消息


2. 延时发送消息


3. 定时发送消息


前面的1,,2,3三个函数,通过sendMessageAtTime来实现的,那么重点分析下他吧

MessageQueue queue = mQueue的消息队列是我们在创建消息循环Looper的时候创建的,这个可以看Handler的构造函数;

target是Handler类型的, 这样消息就可以把消息发送给各自的handler,这样就不会出现多个handler而消息换混乱的问题。。。。

他们的扩展函数:

1.


2.这里我们就可以看到,这里就吧what值付给类消息,再调用sendMessageDelayed函数发送消息,只是一个特殊情况而已。。。


3.


4.



5.


不难发现,3,4,5的函数中叶是同sendMessageAtTime来是实现,这里最重要的就是调用了getPostMessage()

这里其实也就把runbale赋值给了Message中Runnable callback(这里要注意,这个callback和handler中callback(ICallback)是不一样的)。


(三)从Handler中获取消息消息

还有四个同名的函数,他们的是实现都是通过Message.obtain()来实现的;



不难发现,消息是从消息 池中取出来的,如果消息池中没有消息,则才回去此新生成一个;

当然,message中obtain方法也是有很多同名函数的,这里就不举例了。。。。


(四)消息的派发


这里有三种情况来处理消息:

(1)message中callback(Runable)不为空,即通过post把runable对象置入消息中;

这里就调用了需要实现的runable对象中的run()函数;


(2)mCallback(ICallback)不为空

我们只要实现这个接口就可以了。。。这个方法,好像使用的很少,不知哪位大师,可否指教下,什么情况下使用。。。。

(3)(1)(2)都不满足的请款下,就调用了handleMesage函数


至此,我们已经分析了handler的生成,消息的发送以及消息的派发;


最后我们分析下消息循环Looper


1.构造函数

Looper的构造函数是私有的,在构造中生成了队列和获取当前的线程,

这里其实要注意的,发现前面文章中说的是有问题的,我们不难发现,如果我们在主线程中创建默认的handler,他其实创建获和取的消息循环的线程都是在主线程中,因为


而sThread的循环是new Looper实现的,而Lopper中就使用主线程。。。。所以我们前面说错了,这个线程虽然由系统产生,但是他也是主线程,所以以后操作最好使用ThreadHandler.


2.loop实现消息的死循环


这个函数式由系统调用的,所以我们才会说在主线程创建Hanler,不阻塞组线程,并且是异步的。。。。

这里最主要是派发消息和消息的回收。。。


以上就关于handler的源码解析,有问题,或者说错的请指教。。。。。。。



友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: