zoukankan      html  css  js  c++  java
  • 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里面的消息
  • 相关阅读:
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale
    CodeForces 785B Anton and Classes
    CodeForces 785A Anton and Polyhedrons
    爱奇艺全国高校算法大赛初赛C
    爱奇艺全国高校算法大赛初赛B
    爱奇艺全国高校算法大赛初赛A
    EOJ 3265 七巧板
    EOJ 3256 拼音魔法
    EOJ 3262 黑心啤酒厂
  • 原文地址:https://www.cnblogs.com/zhou-guobao/p/5460139.html
Copyright © 2011-2022 走看看