先看下这几个类的关系
Looper:是消息循环监听器,一个线程(包括UI线程)和Handler是一对多的关系,也就是在线程中使用handler,必须要有Looper。
Handler:发送消息和处理消息
Message:一个消息对象
MessageQueue:相当于消息池,Looper中loop()会从MessageQueue.next()取出Message对象。
先来看下,Handler、Message、Looper的使用:
1、UI线程下使用Handler:
输出的log:
这里的handler是在主线程里面工作。
2、子线程使用Handler:
输出的log:
这边的handler是在子线程Thread-660里面工作,,也就是handler的dispatchMessage其实是在子线程里的。
如果不加上Looper.prepare(),Looper.loop()
会出现崩溃:
对比下UI线程程跟子线程使用handler是不一样,其实原理是一样,一个线程的handler必须要有一个looper,UI线程的looper是在Zygote进程孵化出应用进程,然后在这个dalvik应用进程里执行ActivityThread的main方法中实行了Looper.prepareMainLooper()和Looper.loop();
ActivityThread的main():
Looper类中:
Looper.prepareMainLooper()
这边的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.
*/
msg.target.dispatchMessage(msg);就是调用handler的dispatchMessage(msg);
msg.recycleUnchecked进行回收Message对象:
Message类中:recycleUnchecked和obtain的享元模式处理:
recycleUnchecked:
实行完后:
obtain():
实行完:
网友评论