handler

什么是Handler

Handler 是 用于异步消息处理:当发出一个消息之后,首先进入一个消息队列,发出消息的函数即刻返回,而另外一个部分(可以理解为更新UI,handleMessage 方法返回)在消息队列中逐一将消息取出,然后对消息进行处理。

在activity中 new handler 的时候,就已经创建了主线程的 looper 对象(在那里面呢,在activityThread的 main 方法,在应用启动之时),activity 执行 sendMessage 的时候(也就是存入消息的时候,发送消息的时候),都会调用 enqueueMessage 放入 压入 存入 消息 到 消息队列(MessageQueue)中,消息队列中有个全局的变量叫做 mMessage。 在从队列中取出消息的时候 是通过 looper 的 loop 方法 轮询 来取出一个消息,先进先出,后进后出的一个方式,接着在 messageQueue中执行 next 方法 取出一个一个的message 对象,最终调用 handler 的 dispatchMessage 方法,接着是调用 new handler 重写的方法 handlerMessage

在应用启动之时:
activityThread 中 的 main 方法 调用 Looper.prepareMainLooper()方法
创建全局唯一一个主线程 looper 对象

调用 prepare()方法 在 sThreadLocal 中 设置 主线程为 key 主线程的 looper 为值

new looper 中 创建了一个 messageQueue 对象()记得消息队列是在 looper对象中创建的,在构造方法里 是作为 looper对象里面的一个属性 是全局唯一一个主线程消息队列

在 activity 中 new handler 的时候
首先是 重写了 handleMessage 方法 然后在构造方法中 以主线程为 key 得到 全局唯一的主线程 looper 然后把 looper 中的 messageQueue 对象 赋值给 handler 中的 mQueue

在发送消息的时候
调用sendMessage方法,看源码最终调用的都是 enqueueMessage 方法 将消息压入消息队列 最终调用的是 queue 的 enqueueMessage 方法将消息压入消息队列 然后将 message 赋值给 queue 中的全局变量 message 而在 looper 对象中 有一个全局变量 queue 这里相当于给他赋值了 同时在这之前 将自身赋值给 message 中的 属性 handler 方便在 取出消息后 将消息进行消费掉

在取消息的时候
依然要回到 activityThread 的 main 方法中 里面有个 looper.loop 方法 这是一个轮询器 一直在跑 因为里面有个死循环 先是 从 sThreadLocal 中去拿到 looper 当然还是 以主线程 为key 取出 主线程looper 再去拿到 messageQueue 对象 再调用 messageQue 的 next 方法 取出下一个 消息 也就是 message 对象 因为前面已经将 message 对象中的 handler属性和 发送消息的handler 关联 所以在 message中 调用 handler的 dispatchMessage 方法 回调重写的 handlerMessage 方法 完成异步操作

问题及答复


1.png

你可能感兴趣的:(handler)