Osheep

时光不回头,当下最重要。

HandlerLooperMessage享元模式分析

先看下这几个类的关系

Looper:是消息循环监听器,一个线程(包括UI线程)和Handler是一对多的关系,也就是在线程中使用handler,必须要有Looper。

Handler:发送消息和处理消息

Message:一个消息对象

MessageQueue:相当于消息池,Looper中loop()会从MessageQueue.next()取出Message对象。

先来看下,Handler、Message、Looper的使用:

1、UI线程下使用Handler:

《HandlerLooperMessage享元模式分析》

输出的log:

《HandlerLooperMessage享元模式分析》

这里的handler是在主线程里面工作。

2、子线程使用Handler:

《HandlerLooperMessage享元模式分析》

输出的log:

《HandlerLooperMessage享元模式分析》

这边的handler是在子线程Thread-660里面工作,,也就是handler的dispatchMessage其实是在子线程里的。

如果不加上Looper.prepare(),Looper.loop()

会出现崩溃:

《HandlerLooperMessage享元模式分析》

对比下UI线程程跟子线程使用handler是不一样,其实原理是一样,一个线程的handler必须要有一个looper,UI线程的looper是在Zygote进程孵化出应用进程,然后在这个dalvik应用进程里执行ActivityThread的main方法中实行了Looper.prepareMainLooper()和Looper.loop();

ActivityThread的main():

《HandlerLooperMessage享元模式分析》

Looper类中:

Looper.prepareMainLooper()

《HandlerLooperMessage享元模式分析》

这边的static final ThreadLocal sThreadLocal = new

ThreadLocal();是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有在指定线程中可以获取到存储的数据,对于其它线程来说无法获取到数据。

接下来看Looper.loop()循环处理Message:

/**

* Run the message queue in this thread. Be sure to call

* {@link #quit()} to end the loop.

*/

《HandlerLooperMessage享元模式分析》

msg.target.dispatchMessage(msg);就是调用handler的dispatchMessage(msg);

msg.recycleUnchecked进行回收Message对象:

Message类中:recycleUnchecked和obtain的享元模式处理:

《HandlerLooperMessage享元模式分析》

《HandlerLooperMessage享元模式分析》

《HandlerLooperMessage享元模式分析》

recycleUnchecked:

《HandlerLooperMessage享元模式分析》

实行完后:

《HandlerLooperMessage享元模式分析》

obtain():

《HandlerLooperMessage享元模式分析》

实行完:

《HandlerLooperMessage享元模式分析》

点赞