1、Handler的构造方法
- Handler 持有 Looper 的实例,直接持有looper的消息队列
- Looper.myLooper()获取了当前线程保存的Looper实例
- mLooper.mQueue取出Looper实例中保存的MessageQueue(消息队列)
这样就保证了handler的实例与我们Looper实例中MessageQueue关联上了
public class Handler {
final Looper mLooper;
final MessageQueue mQueue;
final android.os.Handler.Callback mCallback;
final boolean mAsynchronous;
public Handler(@Nullable android.os.Handler.Callback callback, boolean async) {
mLooper = android.os.Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread " + Thread.currentThread()
+ " that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
@UnsupportedAppUsage
public Handler(@NonNull Looper looper, @Nullable android.os.Handler.Callback callback, boolean async) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
}
2、Handler的发送消息
2-1、send系列方法
常用的几个发送消息的方法 ``` public final boolean sendMessage(@NonNull Message msg) {
return sendMessageDelayed(msg, 0);
}
public final boolean sendEmptyMessage(int what) {
return sendEmptyMessageDelayed(what, 0);
}
public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {
Message msg = Message.obtain();
msg.what = what;
return sendMessageDelayed(msg, delayMillis);
}
public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg,
long uptimeMillis) {
// msg的target就是Handler自己
msg.target = this;
msg.workSourceUid = ThreadLocalWorkSource.getUid();
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
<a name="EMQVF"></a>
### 2-2、post系列方法
- 把Runable复制给Message.callBack回调
public final boolean post(@NonNull Runnable r) {
return sendMessageDelayed(getPostMessage(r), 0);
}
public final boolean postDelayed(@NonNull Runnable r, long delayMillis) {
return sendMessageDelayed(getPostMessage(r), delayMillis);
}
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
<a name="jrR1v"></a>
### 2-3、hasMessage系列方法
public final boolean hasCallbacks(@NonNull Runnable r) {
return mQueue.hasMessages(this, r, null);
}
public final boolean hasMessages(int what) {
return mQueue.hasMessages(this, what, null);
}
public final boolean hasMessages(int what, @Nullable Object object) {
return mQueue.hasMessages(this, what, object);
}
<a name="Q3nS2"></a>
### 2-4、remove系列方法
/**
* 移除消息
*/
public final void removeCallbacks(@NonNull Runnable r) {
mQueue.removeMessages(this, r, null);
}
public final void removeCallbacks(@NonNull Runnable r, @Nullable Object token) {
mQueue.removeMessages(this, r, token);
}
public final void removeMessages(int what) {
mQueue.removeMessages(this, what, null);
}
public final void removeMessages(int what, @Nullable Object object) {
mQueue.removeMessages(this, what, object);
}
public final void removeCallbacksAndMessages(@Nullable Object token) {
mQueue.removeCallbacksAndMessages(this, token);
}
<a name="dYemB"></a>
### 2-5、总体流程
- 各种发送Message的方法最后调用了sendMessageAtTime,在此方法内部有直接获取MessageQueue然后调用了enqueueMessage方法
- enqueueMessage中msg.target赋值为this,即是当前Handler,然后会调用queue的enqueueMessage的方法,也就是说handler发出的消息,最终会保存到消息队列中去
- 如果大家还记得Looper的loop方法会取出每个msg然后交给msg.target.dispatchMessage(msg)去处理消息,也就是把当前的handler作为msg的target属性
<a name="cXxqg"></a>
## 3、Handler处理消息
<a name="bziDD"></a>
### 3-1、消息处理的优先级
- 现在已经很清楚了Looper会调用prepare()和loop()方法,在当前执行的线程中保存一个Looper实例,这个实例会保存一个MessageQueue对象,然后当前线程进入一个无限循环中去,不断从MessageQueue中读取Handler发来的消息。然后再回调创建这个消息的handler中的dispathMessage方法,处理消息有三个,优先级如下
- 优先级1:Message.callback 处理消息,如果不为空,后续的优先级2 3都不会执行
- 优先级2:Handler.mCallbck 处理消息
- 方法返回true,后续的优先级3就不会执行
- 方法返回false,后续的优先级3还会执行
- 优先级3:复写Handler自己实现的消息处理
/**
* 处理消息
* @param msg
*/
public void dispatchMessage(@NonNull Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
/**
* Handler的成员方法 空方法,我们可以在创建Handler的时候复写该方法
* @param msg
*/
public void handleMessage(@NonNull Message msg) {
}
<a name="USCrm"></a>
### 3-2、消息处理优先级的代码例子
- 优先级1:Message.callback 处理消息,如果不为空,后续的优先级2 3都不会执行
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Handler handler = new Handler(Looper.myLooper(),
new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
Log.d(TAG, "Handler.Callback: "+msg.what);
return false;
}
}){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Log.d(TAG, "Handler.handleMessage: "+msg.what);
}
};
Message msg = Message.obtain(handler, new Runnable() {
@Override
public void run() {
Log.d(TAG, "Message.callback: ");
}
});
msg.what = 10;
handler.sendMessage(msg);
Looper.loop();
}
}).start();
log日志如下: D/MainActivity: Message.callback:
- 优先级2:Handler.mCallbck 处理消息
- 方法返回true,后续的优先级3就不会执行
- 方法返回false,后续的优先级3还会执行
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Handler handler = new Handler(Looper.myLooper(),
new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
Log.d(TAG, "Handler.Callback: "+msg.what);
return true;
}
}){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Log.d(TAG, "Handler.handleMessage: "+msg.what);
}
};
Message msg = Message.obtain(handler);
msg.what = 10;
handler.sendMessage(msg);
Looper.loop();
}
}).start();
情况1:Handler.Callback.handleMessage返回true,日志如下 D/MainActivity: Handler.Callback: 10
情况2:Handler.Callback.handleMessage返回,日志如下 D/MainActivity: Handler.Callback: 10 D/MainActivity: Handler.handleMessage: 10
- 优先级3:复写Handler自己实现的消息处理
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Handler handler = new Handler(Looper.myLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Log.d(TAG, "Handler.handleMessage: "+msg.what);
}
};
Message msg = Message.obtain(handler);
msg.what = 10;
handler.sendMessage(msg);
Looper.loop();
}
}).start();
log日志如下: D/MainActivity: Handler.handleMessage: 10
<a name="o2j8R"></a>
## 4、Looper/Handler整体流程
- 首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象;因为Looper.prepare()在一个线程中只能调用一次,所以MessageQueue在一个线程中只会存在一个。
- Looper.loop()会让当前线程进入一个无限循环,不端从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。
- Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。
- Handler的sendMessage方法,会给msg的target赋值为handler自身,然后加入MessageQueue中。

- 简化代码
public class Handler {
final Looper mLooper;
final MessageQueue mQueue;
/**
* Handler的Callback可以处理消息
*/
final android.os.Handler.Callback mCallback;
final boolean mAsynchronous;
public Handler(@Nullable android.os.Handler.Callback callback, boolean async) {
mLooper = android.os.Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread " + Thread.currentThread()
+ " that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
@UnsupportedAppUsage
public Handler(@NonNull Looper looper, @Nullable android.os.Handler.Callback callback, boolean async) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
public final boolean sendMessage(@NonNull Message msg) {
return sendMessageDelayed(msg, 0);
}
public final boolean sendEmptyMessage(int what) {
return sendEmptyMessageDelayed(what, 0);
}
public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {
Message msg = Message.obtain();
msg.what = what;
return sendMessageDelayed(msg, delayMillis);
}
public final boolean post(@NonNull Runnable r) {
return sendMessageDelayed(getPostMessage(r), 0);
}
public final boolean postDelayed(@NonNull Runnable r, long delayMillis) {
return sendMessageDelayed(getPostMessage(r), delayMillis);
}
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
/**
* 消息加入消息队列
* @param queue
* @param msg
* @param uptimeMillis
* @return
*/
private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg,
long uptimeMillis) {
// msg的target就是Handler自己
msg.target = this;
msg.workSourceUid = ThreadLocalWorkSource.getUid();
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
/**
* 判断消息队列中是否有该消息
*/
public final boolean hasCallbacks(@NonNull Runnable r) {
return mQueue.hasMessages(this, r, null);
}
public final boolean hasMessages(int what) {
return mQueue.hasMessages(this, what, null);
}
public final boolean hasMessages(int what, @Nullable Object object) {
return mQueue.hasMessages(this, what, object);
}
/**
* 移除消息
*/
public final void removeCallbacks(@NonNull Runnable r) {
mQueue.removeMessages(this, r, null);
}
public final void removeCallbacks(@NonNull Runnable r, @Nullable Object token) {
mQueue.removeMessages(this, r, token);
}
public final void removeMessages(int what) {
mQueue.removeMessages(this, what, null);
}
public final void removeMessages(int what, @Nullable Object object) {
mQueue.removeMessages(this, what, object);
}
public final void removeCallbacksAndMessages(@Nullable Object token) {
mQueue.removeCallbacksAndMessages(this, token);
}
/**
* 处理消息
* @param msg
*/
public void dispatchMessage(@NonNull Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
/**
* Handler的成员方法 空方法,我们可以在创建Handler的时候复写该方法
* @param msg
*/
public void handleMessage(@NonNull Message msg) {
}
} ```