很多人对与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
好了,到这里就已经全部的介绍完了,希望对你们有一些帮助,谢谢~~