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;}@UnsupportedAppUsagepublic 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() {@Overridepublic void run() {Looper.prepare();Handler handler = new Handler(Looper.myLooper(),new Handler.Callback() {@Overridepublic boolean handleMessage(@NonNull Message msg) {Log.d(TAG, "Handler.Callback: "+msg.what);return false;}}){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);Log.d(TAG, "Handler.handleMessage: "+msg.what);}};Message msg = Message.obtain(handler, new Runnable() {@Overridepublic 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() {@Overridepublic void run() {Looper.prepare();Handler handler = new Handler(Looper.myLooper(),new Handler.Callback() {@Overridepublic boolean handleMessage(@NonNull Message msg) {Log.d(TAG, "Handler.Callback: "+msg.what);return true;}}){@Overridepublic 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() {@Overridepublic void run() {Looper.prepare();Handler handler = new Handler(Looper.myLooper()){@Overridepublic 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;}@UnsupportedAppUsagepublic 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) {}
} ```
