详细全面了解handler机制

来源:互联网 发布:部落冲突七本满防数据 编辑:程序博客网 时间:2024/05/17 08:38

很多人对与handler并不是很了解,今天我就详细的说一下handler机制

今天我们就从这几大点入手:

 Android中的Handler的机制与用法详解,什么是Handler如何传递 Message传递 Runnable 对象传递 Callback 对象Handler 原理是什么?Handler 与 Looper、MessageQueue 的关系,HandlerThread是什么?Android 中更新 UI 的几种方式。


接下来,就要进入主题了!!!


首先:

什么是Handle?它是干什么用?使用场景用那些?

在Android中提供了一种异步回调机制,使我们更新 UI 的一套机制,也是一套消息处理的机制,我们可以发送消息,也可以通 它来处理消息

完成一个很长时间的任务后做出相应的通知

     对于使用场景,这里就已很多了,就比如说ViewPager中的无限轮播图,就用到了handler机制来处理时间

Handler 与 Looper、MessageQueue 的关系:

(1)Looper:相当于消息的载体

     它的内部有一个消息队列,也就是MessageQueue,Handler发送的所有消息都会走向这个消息队里。

     它的Looper.loop方法是一个死循环,不断的从消息队列MessageQueue中取出消息。如果有消息存在就处理该消息,否则就阻塞。

(2)MessageQue:就是一个消息队列,可以向其中添加消息并处理消息。

(3)Handler其实就是发送消息处理消息的封装。它与Looper相关联,也就是说在Handler的内部可以找到Looper,找到了Looper就找到了相应的消息队

列。因此Handler发送的消息都会走向MessageQueue。

简单来说,就一段话:handler 负责发送消息,Looper 负责接收 Handler 发送消息,并直接把消息回传给 handler 自己,MessageQueue 就是一个存储消息的容器。

Handle中有哪些重要方法

Message
消息,理解为线程间通讯的数据单元。例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程。

Message Queue
消息队列,用来存放通过Handler发布的消息,按照先进先出执行。

Looper 
循环器,扮演Message Queue和Handler之间桥梁的角色,循环取出Message Queue里面的Message,并交付给相应的Handler进行处理。

UI thread
通常就是main thread,而Android启动程序时会替它建立一个Message Queue。每一个线程里可含有一个Looper对象以及一个MessageQueue

数据结构。在你的应用程序里,可以定义Handler的子类别来接收Looper所送出的消息。

Handler 的原理是什么?:、

1、Handler 封装了消息的发送(主要包括消息发送给谁) Looper:

2、内部包含一个消息队列也就是 MessageQueue,所有 Handler 发送的消息都走向这个队列。

3、Looper.loop()方法,就是一个 for 死循环,不断的从 MessageQueue 取消息,如果有消息就处理消息,没有消息就阻塞。

4、MessageQueue,就是一个消息队列,可以添加消息,处理消息。

5、Handler 也不难,比较简单,在构造 Handler 时候内部会跟 Looper 进行关联,通过 Looper.myLooper() 获取到Looper,找到 Looper 也就找到了 MessageQueue。在 Handler 中发送消息,其实是向 MessageQueue 队列中发送消息。

Handler、MessageQueue、Looper 之间的调用图



 传递 Message:

用于接受子线程发送的数据,并用此数据配合主线程更新 UI

1、post(Ruannable);
2、postAtTime(Runnable, long);
3、postDelayed(Runnable long);
postDelayed是延迟多少时间再post,postAtTime是在设定的目标时间再post
4、
用于接受子线程发送的数据,并用此数据配合主线程更新 UI


传递 Runnable 对象

用于通过 Handler 绑定的消息队列,安排不同操作的执行顺序

1、sendEmptyMessage(int);
2、sendMessage(Message);
3、sendMessageAtTime(Message, long);
4、sendMessageDelayed(Message, long);


传递 Callback 对象:

Callback 用于截获 handler 发送的消息,如果返回 true 就截获成功不会向下传递了

public Handler mHandler = new Handler(new Handler.Callback() {    @Override    public boolean handleMessage(Message msg) {        // TODO Auto-generated method stub        Toast.makeText(getApplicationContext(), "HandleMessage 1", Toast.LENGTH_SHORT).show();        return true;    }}) {    public void handleMessage(Message msg) {        // TODO Auto-generated method stub        Toast.makeText(getApplicationContext(), "handleMessage 1", Toast.LENGTH_SHORT).show();    };}

HandlerThread 

继承于 Thread,所以它本质就是个 Thread。与普通的 Thread 的差别就在于,它有个 Looper 成员变量。

这个 Looper 其实就是对消息队列以及队列处理逻辑的封装,简单来说就是消息队列+消息循环。


android中更新UI 方式有几种?

1、handler中的post
2、handler中的sendMessage
3、RunOnUiThread
4、View中的Post


好了,到这里就已经全部的介绍完了,希望对你们有一些帮助,谢谢~~

原创粉丝点击