Handler原理总结

xiaoxiao2021-02-28  119

Handler用于将一个任务切换到某个指定线程中去执行,可以看成一个生产者消费者模式, Handler在子线程中发送消息,最终是通过MessageQueue的enqueueMessage方法把Message对象添加到MessageQueue中, MessageQueue维护了Message这个单链表的具体操作。

而主线程中Looper是系统自动创建的,在其loop方法用于读取MessageQueue中的消息对象,并交由handler的dispatchMessage方法去分发消息, 处理完成后回收Message对象。

Looper通过prepare方法创建,并用ThreadLocal持有这个对象。 为什么用ThreadLocal持有Looper对象? 一般来说,当某些数据是以线程为作用域并且不同线程具有不同副本的时候, 可以考虑采用ThreadLocal。 Looper就属于这种情况,如果不采用ThreadLocal,那系统就必须提供一个全局的 哈希表拱Handler查找指定线程的Looper。

分发消息的机制是: 1.先判断msg的callback是否为空,不为空则处理callback任务,这个任务是通过post方法已实现Runnable接口的形式添加的。 2.如果msg的callback为空,则判断Handler的成员Callback是否为空,如果不为空,则执行Callback的handleMessage方法的具体实现, 这个具体实现是以不需要派生Handler子类的形式生成Handler传入的参数。 3.如果执行callback的handlerMessage返回true,则结束消息处理。否则继续调用Handler的handleMessage方法处理消息。 4.如果没有传入callback的实现,而直接以派生子类的方式创建Handler,则直接执行Handler的handleMessage方法处理消息。

转载请注明原文地址: https://www.6miu.com/read-30253.html

最新回复(0)