一.
Carson的handler机制的源码分析写的非常的清晰,强烈建议大家去学习,我今天写这篇文章只是做简单的补充。
Handler机制源码分析
1.Handler 类中,分发处理消息的方法dispatchMessage():
/**
* Handle system messages here.
*/
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg); // 第一处理消息的地方
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
// 第一处理消息的地方
return;
}
}
handleMessage(msg); // 第三处理消息的地方
}
}
在对消息的处理方法中有三处处理消息的地方,对应着三种处理消息的方法
首先是第一种 ,msg.callback != null 就去执行 handleCallback(msg) 这个就是我们熟知的 执行 Runnable的方法,而第三种就是 我们熟知的重写 Handler的handleMessage方法,来实现对消息的处理。而第二种呢? mCallback 是什么? 在Handler的代码中找到mCallback 是Callback 类型,而Callback 是一个接口,如下:
public interface Callback {
/**
* @param msg A {@link android.os.Message Message} object
* @return True if no further handling is desired
*/
public boolean handleMessage(Message msg);
}
那个mCallback 又是怎么来的,其中看看 Handler的构造函数就能发现端倪:这个mCallback 是创建Handler是传进来的。
* @param callback The callback interface in which to handle messages, or null.
*/
public Handler(Callback callback) {
this(callback, false);
}
真相大白了,dispatchMessage中对应的第二种处理消息的方式其实就是 通过创建Handler时,传进来的,实现了Callback 的参数实现的(这个参数可以为null)。
2.同步屏障:
同步屏障
3.handler阻塞机制
阻塞机制
4.保证一个线程只能有一个Looper,一个消息队列的机制 ThreadLocal
ThreadLocal