zoukankan      html  css  js  c++  java
  • Message,MessageQueue,Looper,Handler ——由view.post(runnable想到的)

    近日看到代码有view.post(runable),发现对handler机制又有些模糊,故做些复习。

    这里就不再对具体的源码原理做深入复习了,就抄一些基本的结论吧。

    1.基本概念

    Message:基本的信息类

    MessageQueue:Message队列,每个线程存储Message的容器

    Looper:MessageQueue的管理者,每个线程只有一个,保存一直循环运转的状态,一旦发现MessageQueue中有Message就广播通知Handler进行处理

    Handler:Message的发送者和处理者

    2.基本功能原理

    1、Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象;因为Looper.prepare()在一个线程中只能调用一次,所以MessageQueue在一个线程中只会存在一个。

    2、Looper.loop()会让当前线程进入一个无限循环,不端从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。

    Activity的启动代码中,已经在当前UI线程调用了Looper.prepare()和Looper.loop()方法。其他线程使用Looper需要显式调用Looper.prepare()和Looper.loop()方法。

    3、Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。

    4、Handler的sendMessage方法,会给msg的target赋值为handler自身,然后加入MessageQueue中。

    5、在构造Handler实例时,我们会重写handleMessage方法,也就是msg.target.dispatchMessage(msg)最终调用的方法。

    6、Handler.post(runnable),其实依然调用的是Handler.sendMessage。而runnable中的逻辑可以理解为handerMessage中的流程

    3.关于view.post(runnable)

    View.post(runnable)可以理解成 New Handler(getMainLooper()).post(runnable)

     其实就是让runable里的逻辑在主线程中执行即可。

    4.最后抄几张图贴上来,以便记忆。

    参考资料:http://blog.csdn.net/lmj623565791/article/details/38377229  Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系

  • 相关阅读:
    VUE 路由
    JS小表达式
    JS正则表达式
    react案例—实现组件之间的通信
    React脚手架搭建
    react属性三ref
    react属性二props
    java多线程2
    jvm小结2
    spark小结3
  • 原文地址:https://www.cnblogs.com/xerrard/p/4685499.html
Copyright © 2011-2022 走看看