美文网首页
handler机制,四个组成部分及源码解析

handler机制,四个组成部分及源码解析

作者: MiniC | 来源:发表于2018-05-24 14:07 被阅读0次

在UI线程中不能进行耗时操作,例如数据读写、网络请求。Android 4.0开始,在主线程中进行网络请求甚至会抛出Android.os.NetworkOnMainThreadException。这个时候,我们就会开始依赖Handler。我们在子线程进行耗时操作后,将请求结果通过Handler的sendMessge**() 方法发送出去,在主线程中通过Handler的handleMessage 方法处理请求结果,进行UI的更新。

四个组成部分:Message、MessageQueue、Looper以及Handler

参考 https://blog.csdn.net/garyhu1/article/details/54573548

这个写的非常详细。我得多琢磨琢磨一会。

我自己理解下

1.Message

Message类

Message 实现了Parcelable 接口,也就是说实现了序列化,这就说明Message可以在不同进程之间传递。

使用obtain 方法可以从消息池中获取Message的实例,也是推荐大家使用的方法,而不是直接调用构造方法。

2.MessageQueue

next方法

这个next方法相当于是队列出栈。

3.Looper

上面说到了MessageQueue,那么这个Queue又是由谁创建的呢?其实就是Looper。关于Looper有两个关键方法:

prepare()和loop()

对于每一个线程只能有一个Looper。

Looper方法

这样,MessageQueue 就被创建了。这里也可以看到,默认情况下,一个MessageQueue的quiteAllow=true。

我们可以在不同的线程中创建各自的Handler,进行各自的通信而不会互相干扰。

loop方法

在一个死循环中,通过队列出栈的形式,不断从MessageQueue 中取出新的Message,然后执行msg.target.dispatchMessage(msg) 方法,还记的前面Message类的定义吗,这个target属性其实就是一个Handler 对象,因此在这里就会不断去执行Handler 的dispatchMessage 方法。如果取出的Message对象为null,就会跳出死循环,一次Handler的工作整个就结束了。

4.handler

handler

调用Looper.myLooper()赋值给当前mLooper,关联MessageQueue;

然后在后续的执行方法中handler与message进行了关联,因为message有个target属性被赋值为handler。之后消息队列进行入队。然后在loop方法中,会从messagequeue中出去message,并执行他的dispatchMessage方法。这个方法就会调用handler的runnable方法。

在一个Android 程序启动之初,系统会帮我们为这个主线程创建好Looper。只不过这个方法名字比较特殊,叫做prepareMainLooper。

这就是Handler的实现机制,这里再做一次总结称述。

通过Looper的prepare方法创建MessageQueue

通过loop方法找到和当前线程匹配的Looper对象me

从me中取出消息队列对象mQueue

在一个死循环中,从mQueue中取出Message对象

调用每个Message对象的msg.target.dispatchMesssge方法

也就是Handler的dispatchMessage 方法

在dispatchMessage 根据Message对象的特点执行特定的方法。

还有一点问题:为什么会跑到主线程中的?这个我还得自己琢磨一会。

相关文章

网友评论

      本文标题:handler机制,四个组成部分及源码解析

      本文链接:https://www.haomeiwen.com/subject/ltzjjftx.html