Android-Handle
一 什么是Handle
Handle:
A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue
一个Handle是允许你去和一个线程的消息队列去发送和接收消息的对象
你可以构造handle对象来与Looper沟通,以便push新消息到messageQueue里面,或者接收Looper(从Message Queue取出)所送来的消息
如下图:
Handle特点:
Handle实例与消息处理是关联的,发送和接收要匹配
Handle只能依附在HandleThread线程
Handle可以通过设置Looper来选择其依附的线程
Handle所有的操作都是在用一个线程
Handle的removeMessage函数只能移除队列中的Message
二 作用:
1,执行计划任务
主要使用的函数是:
postAtTime,postDelayed,sendMessageAtTime,sendMessageDelayed
2,线程间通讯
在android的应用启动的时候,会创建一个主线程,主线程会创建一个消息队列来处理各种消息
当你创建子线程的时候,你可以在你的子线程中拿到福线程中创建的Handle对象
由于Android要求在UI中更新界面,所以使用的最多的情况是在子线程中更新主线程的UI
3,确保操作始终在某个特定的线程中运行
例如当我们从数据库加载数据的时候,除了程序启动时需要加载外
每当我们收到数据改变的通知时也需要重新加载为了确定数据的有效性(始终使用最后一次查询得到的数据)
并减少不必要的查询操作,我们应当确保他们在同一个线程中运行
4,用到的概念:
线程:UI Thread通常就是main Thread, 而android启动程序会替他建立一个Message Queue
message:消息
messageQueue:消息队列,用来存放线程放入的消息
Looper:相当于隧道,一个线程可以产生一个Looper对象,由他来管理县城里面的messageQueue消息队列
Looper.myLooper直接得到当前线程的Looper
looper.getMainLooper得到UI主线程的Looper
Looper的实现原理:
类似于windows编程的消息机制
在Android中接收消息队列的消息,然后分发给Handle,
在windows中分发给window
误区:Handle不一定在主线程
三 面试题:
1,多个Handle使用同一个HandleThread的时候,同一个HandleThread中可以有多个Handle吗?
yes
2,多个Handle使用同一个HandleThread的时候,同一个HandleThread中使用多个Handle的Message会混淆吗?为什么?
No,因为每个Message都有一个对应的target
不管是post还是sendMessage,最后都是调用sendMessageAtTime,在同一个线程中,同一个队列中
附上Handle的源代码,方便大家查看及分析
http://pan.baidu.com/s/1bnEuvU3
3,Handle可以创建到任意的线程中吗?
不可以,只能在Looper.onLooperPrepared中创建Handle并发送消息
4,如何指定Handle运行的线程
只要指定Handle使用的Looper就可以指定运行的线程,提高了程序的灵活性
5,同一个Handle中不同的消息会同时执行吗?
不可能交叉执行,只有处理完一条消息才会去处理下一条消息
6,对于正在执行的Message, 调用RemoveMessage会有什么后果,消息会终止吗?
不会,一旦消息发送出去,RemoveMessage就无效,removeMessage只能
移除队列中的Message
例如用户快速的点击按钮,我的程序无法有足够快的相应,该怎么办?
先调用RemoveMessage移除相同的操作
7,使用Handle是异步的,它会建立新的线程吗
不会建立,只是在新的线程中运行
8,Handle是在主线程内吗?
不一定
9,Handle的post和sendMessage使用的是一个队列还是两个?
使用的相同的一个
版权声明:欢迎交流,QQ872785786
原文地址:http://blog.csdn.net/qq_22075977/article/details/46791329