• android handler工作原理


    android handler工作原理

    作用

    便于在子线程中更新主UI线程中的控件
    这里涉及到了UI主线程和子线程

    UI主线程

    它很特别。通常我们会认为UI主线程将页面绘制完成,就结束了。但是它没有。它在一直默默等待着来自用户操作控件发生的事件消息。

    • 这里的事件和其中包含的信息都被封装为一个message,它是Parcelable对象。
    • 主线程不能同时处理所有的事件,这个时候就需要一个存放消息的队列message queue
    • 它里面包含了一个叫looper,用来管理这个消息池子
    • handler在其中负责发送和处理事件
    • 去查看Activity中的源码,会发现它会自己创建一个final类型的handler,还有looper的身影。

    looper

    • 这个用来管理messageQueue的,主要的执行方法在looper.loop()方法中。大家都这么说
    • UI主线程会给自己创建一个looper对象。子线程的looper需要手动的创建。
    • 当handler在UI主线程上进行实例化的时候,自动持有主线程的looper。

    messageQueue

    它叫队列,之前以为它里面会有Array或者List之类的,但是在源码里面没有看到。
    它队列的实现,是通过message对象中的属性变量next,来指向下一个message

    message

    消息对象的实体

    handler

    它的内部实现包含子线程thread、回调函数callback、成员变量looper
    每当handler调用sendMessage()(或者其它类似相关方法)的时候,将会向messageQueue里面添加一个message。添加的时候会去检查该message与队列中已经存在的message的when属性,判断谁在前谁在后
    其实,两条线程之间的数据交互,一般采用回调方法。handler的实现原理也是依据如此。

    具体的使用方法

    • 在UI主线程中调用没有参数的构造方法创建Handler的时候,使用的looper对象就是主线程的Looper
    • 在子线程中调用没有参数的构造方法创建handler的时候,需要主动创建looper对象:Looper.prepare()方法;不然在运行的时候就会报错说"Can't create handler inside thread that has not called Looper.prepare()"
    • 在子线程中可以将主线程的looper作为构造方法的参数创建handler,就不需要在子线程中创建自己的looper了。这个时候回调方法handleMessage(Message msg)方法将会放在主线程中执行,所以这里面不要放特别耗时的操作。
      Handler mHandler =new Handler(Looper.getMainLooper())
    • 在activity中的handler中含有未执行的delay消息的时候,调用activity.onFinish()方法之后,onDestory()不会立刻被调用。所以一般情况下,在调用onFinish()方法的时候需要清理一下mhandler里面的消息
  • 相关阅读:
    lua table
    lua basic
    lua5.4 coroutine的通俗理解
    HarmonyOS实战—实现双击事件
    HarmonyOS实战—单击事件的四种写法
    HarmonyOS实战—实现单击事件流程
    苹果CMS对接公众号教程
    Spring快速入门
    YYCMS搭建影视网站教程
    分享几个开源Java写的博客系统
  • 原文地址:https://www.cnblogs.com/zhou-guobao/p/5460139.html
Copyright © 2020-2023  润新知