android handler的用法与处理机制
应用场景
我们在实际开发中,总会遇到处理网络信息、子线程中需要进行更新UI操作、封装一些请求回调等api,这时便需要处理不同线程之间的通信,而我们android提供的handler消息处理机制便发挥到了作用。
相关概念
Message
消息:
理解为线程间通讯的数据单元。例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程。
Message Queue
消息队列:
用来存放通过Handler发布的消息,按照先进先出执行。
Handler
:
Handler是Message的主要处理者,负责将Message添加到消息队列以及对消息队列中的Message进行处理。
Looper
循环器:
扮演Message Queue和Handler之间桥梁的角色,循环取出Message Queue里面的Message,并交付给相应的Handler进行处理。
线程
:
UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。每一个线程里可含有一个Looper对象以及一个MessageQueue数据结构。在你的应用程序里,可以定义Handler的子类别来接收Looper所送出的消息。
Handler的使用
handler原理
最根本的目的就是解决多线程并发的问题,假设在一个 Activity 当中,有多个线程去更新 UI,并且对更新的 UI 的操作进行枷锁处理的话又会产生什么样的问题呢? 那就是性能下降,Handler 通过消息队列,保证了消息处理的先后有序。
鉴于以上问题的考虑,Android 给我们提供了一套更新 UI 的机制,我们只要使用一套机制就好,所有的更新 UI 的操作都是在主线程中轮询处理。
Handler 封装了消息的发送(主要包括消息发送给谁)
Looper:内部包含一个消息队列也就是 MessageQueue,所有 Handler 发送的消息都走向这个队列。
Looper.loop()方法,就是一个 for 死循环,不断的从 MessageQueue 取消息,如果有消息就处理消息,没有消息就阻塞。
MessageQueue,就是一个消息队列,可以添加消息,处理消息。
Handler 也不难,比较简单,在构造 Handler 时候内部会跟 Looper 进行关联,通过 Looper.myLooper() 获取到 Looper,找到 Looper 也就找到了 MessageQueue。在 Handler 中发送消息,其实是向 MessageQueue 队列中发送消息。
代码演示
//创建一个Handler,我们在哪个线程中实例化的
// 这个handler是与哪个线程进行绑定的,一般是在主线程中实例化
Handler handler=new Handler();
handler有两种消息分发方式一种是发送Runnable对象,另一种是发送message消息的方式。
发送Runnable对象的fangsh
//创建一个Runnable对象
Runnable myRunnable=new Runnable() {
@Override
public void run() {
//需要在主线程中执行的任务...
}
};
//通过发送Runnable对象的方式将子线程任务发回到主线程去执行
//post立即执行Runnable对象
//postAtTime在指定时间执行
//postDelayed在指定时间间隔执行
handler.post(myRunnable);
发送message消息的方式
//向主线程中发送消,通过obtainMessage()来获取可以复用
//消息队列中的msg这样可以减少资源浪费
Message msg=handler.obtainMessage();
msg.arg1=1;
msg.obj="发送各种消息";
//向主线程中发送消息
handler.sendMessage(msg);
通过重写handleMessage方法来获取信息内容
private Handler handler=new Handler(){
public void handleMessage(android.os.Message msg){
//通过重写handleMessage方法来,接受消息
int what=msg.what;
int arg=msg.arg1;
String obj= (String) msg.obj;
//针对得到的消息进行相应的业务处理....
}
};