android handler工做原理

android handler工做原理

做用

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

UI主线程

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

  • 这里的事件和其中包含的信息都被封装为一个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

消息对象的实体oop

handler

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

具体的使用方法

  • 在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里面的消息
相关文章
相关标签/搜索