美文网首页Android知识Android进阶之旅程序员
HandlerLooperMessage享元模式分析

HandlerLooperMessage享元模式分析

作者: umbrella1 | 来源:发表于2017-05-11 22:24 被阅读67次

    先看下这几个类的关系

    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():

    实行完:

    相关文章

      网友评论

        本文标题:HandlerLooperMessage享元模式分析

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