Handler
2019-04-17 本文已影响0人
郑捡书
重点类 : Handler、Looper、MessageQueue、Message
1.Looper 的作用是将 Message 对象从 MessageQueue 中取出来,并将其交给 Handler#dispatchMessage(Message) 方法
2.Handler 的作用是将 Message 对象发送到 MessageQueue 中去,同时将自己的引用赋值给 Message#target。
3.MessageQueue 的作用负责插入和取出 Message
主线程一旦存在就创建了Looper,而Looper内部又创建了MessageQueue,所以在创建Handler的时候传入了一个Looper对象,一般我们都是获取Looper.getMainLooper(),这时候三者就关联了起来。使用Handler发送message其实就是往Looper对象的MessageQueue变量发送(起到存储的作用),而Looper内部一直在轮询(死循环阻塞)获取MessageQueue的消息,一旦获取到新消息则回调Handler的CallBack接口。
第一点解析
// 获取Message用于存放信息
Message message = mHandler.obtainMessage();
=================源码=====================
// 获取一个Message
public final Message obtainMessage()
{
return Message.obtain(this);
}
// 将Handler引用赋值给Message对象的target字段
public static Message obtain(Handler h) {
Message m = obtain();
m.target = h;
return m;
}
MessageQueue 中的 Message 是有序的吗?排序的依据是什么
是有序的。Queue 都是有序的(先进先出),Set 才是无序的,排序的依据是 Message#when 字段,表示一个相对时间,该值是由 MessageQueue#enqueueMessage(Message, Long 时间) 方法设置的。
message.sendToTarget();
==================源码==================
// 内部是handler引用调用自身的方法
public void sendToTarget() {
target.sendMessage(this);
}
public final boolean sendMessage(Message msg)
{
return sendMessageDelayed(msg, 0);
}
····
····
····
最终调用MessageQueue#enqueueMessage(Message msg, long uptimeMillis)
handler处理事件源码分析
public void dispatchMessage(Message msg) {
// 每个Message的callback 都是Runnable接口,分开设置处理
if (msg.callback != null) {
handleCallback(msg);
} else {
// 总处理,mCallback 是构造函数传入的
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
// 空实现,上面mCallback ==null或者返回false都会执行
handleMessage(msg);
}
}
如何判断当前线程是不是主线程
// 1
Looper.myLooper() == Looper.getMainLooper()
// 2
Looper.getMainLooper().getThread() == Thread.currentThread()
// 3 是上面2的简化
Looper.getMainLooper().isCurrentThread()