详细全面了解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
好了,到这里就已经全部的介绍完了,希望对你们有一些帮助,谢谢~~
- 详细全面了解handler机制
- handler消息机制了解
- 一步一步了解handler机制
- handler机制原理全面整理
- 全面分析Handler消息机制
- handler机制详细解释
- 全面解析Android之Handler机制
- 详细了解 MySQL锁机制
- android中的消息机制 了解Handler
- 深入了解android中的消息机制Handler
- 深入了解Handler消息机制(一)
- 深入了解Handler消息机制(二)
- 浅谈近期了解的Handler机制
- Linux Bottome Half Handler 机制详细解析
- Android Handler Looper机制详细分析
- Handler异步通信机制全面解析(包含Looper、Message Queue)
- android事件传递机制的详细了解
- android事件传递机制的详细了解
- oracle中的条件控制语句
- 笨方法学习Python-习题43、44
- 一头扎进springboot之访问jsp页面
- Elasticsearch(一)elasticsearch5.3.0版本安装与head插件安装
- oracle的PL/SQL定义类型
- 详细全面了解handler机制
- 蓝桥杯-九宫重排-bfs+康托展开+逆序数判断
- C# 开发Chrome内核浏览器(WebKit.net)
- 为什么我们要切换到Linux?我要怎样切换到Linux?
- 一文看懂如何用贝叶斯解决实际问题
- laravel eloquent 模型关联
- C#和WPF开发中的多线程
- Hbase API
- LWIP使用经验---变态级(好文章)