做Android开发肯定离不开Handler,我们都知道,它主要是做主线程与子线程之间的通信工具,所以只要有异步线程与主线程的地方就有Handler
1.对Handler的基本认识
Handler 发送并处理与一个线程关联的 Message 和 Runnable ,每个 Handler 都会跟一个线程绑定,并与该线程的 MessageQueue 关联在一起,从而实现消息的管理以及线程间通信。
1.1基本用法
android.os.Handler handler = new Handler(){
@Override
public void handleMessage(final Message msg) {
//这里接受并处理消息
}
};
//发送消息
handler.sendMessage(message);
handler.post(runnable);
实例化一个 Handler 重写 handleMessage
方法 ,然后在需要的时候调用它的 send
以及 post
系列方法就可以了
2.Handler的原理
2.1 Handler和Looper的关联
实例化 Handler 的时候 Handler 会去检查当前线程的 Looper 是否存在,如果不存在则会报异常,也就是说在创建 Handler 之前一定需要先创建 Looper 。
public Handler(Callback callback, boolean async) { Looper mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); } //Looper 持有一个 MessageQueue mQueue = mLooper.mQueue; }
平时直接使用感受不到这个异常是因为主线程已经为我们创建好了 Looper,Looper 提供了 Looper.prepare()
方法来创建 Looper ,并且会借助 ThreadLocal 来实现与当前线程的绑定功能。
2.2 Message 的存储与管理
以 sendEmptyMessage(int)
方法为例:
//Handler
sendEmptyMessage(int)
sendEmptyMessageDelayed(int,int)
sendMessageAtTime(Message,long)
enqueueMessage(MessageQueue,Message,long)
queue.enqueueMessage(Message, long);
2.3 总结
- Looper :负责关联线程以及消息的分发在该线程下**从 MessageQueue 获取 Message,分发给 Handler ;
- MessageQueue :是个队列,负责消息的存储与管理,负责管理由 Handler 发送过来的 Message ;
- Handler : 负责发送并处理消息,面向开发者,提供 API,并隐藏背后实现的细节。