1、Handler的构造方法

  • Handler 持有 Looper 的实例,直接持有looper的消息队列
  • Looper.myLooper()获取了当前线程保存的Looper实例
  • mLooper.mQueue取出Looper实例中保存的MessageQueue(消息队列)
  • 这样就保证了handler的实例与我们Looper实例中MessageQueue关联上了

    1. public class Handler {
    2. final Looper mLooper;
    3. final MessageQueue mQueue;
    4. final android.os.Handler.Callback mCallback;
    5. final boolean mAsynchronous;
    6. public Handler(@Nullable android.os.Handler.Callback callback, boolean async) {
    7. mLooper = android.os.Looper.myLooper();
    8. if (mLooper == null) {
    9. throw new RuntimeException(
    10. "Can't create handler inside thread " + Thread.currentThread()
    11. + " that has not called Looper.prepare()");
    12. }
    13. mQueue = mLooper.mQueue;
    14. mCallback = callback;
    15. mAsynchronous = async;
    16. }
    17. @UnsupportedAppUsage
    18. public Handler(@NonNull Looper looper, @Nullable android.os.Handler.Callback callback, boolean async) {
    19. mLooper = looper;
    20. mQueue = looper.mQueue;
    21. mCallback = callback;
    22. mAsynchronous = async;
    23. }
    24. }

    2、Handler的发送消息

    2-1、send系列方法

  • 常用的几个发送消息的方法 ``` public final boolean sendMessage(@NonNull Message msg) {

    1. return sendMessageDelayed(msg, 0);

    }

    public final boolean sendEmptyMessage(int what) {

    1. return sendEmptyMessageDelayed(what, 0);

    }

    public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {

    1. Message msg = Message.obtain();
    2. msg.what = what;
    3. return sendMessageDelayed(msg, delayMillis);

    }

    public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {

    1. if (delayMillis < 0) {
    2. delayMillis = 0;
    3. }
    4. return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);

    }

    public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {

    1. MessageQueue queue = mQueue;
    2. if (queue == null) {
    3. RuntimeException e = new RuntimeException(
    4. this + " sendMessageAtTime() called with no mQueue");
    5. Log.w("Looper", e.getMessage(), e);
    6. return false;
    7. }
    8. return enqueueMessage(queue, msg, uptimeMillis);

    }

  1. private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg,
  2. long uptimeMillis) {
  3. // msg的target就是Handler自己
  4. msg.target = this;
  5. msg.workSourceUid = ThreadLocalWorkSource.getUid();
  6. if (mAsynchronous) {
  7. msg.setAsynchronous(true);
  8. }
  9. return queue.enqueueMessage(msg, uptimeMillis);
  10. }
  1. <a name="EMQVF"></a>
  2. ### 2-2、post系列方法
  3. - 把Runable复制给Message.callBack回调
  1. public final boolean post(@NonNull Runnable r) {
  2. return sendMessageDelayed(getPostMessage(r), 0);
  3. }
  4. public final boolean postDelayed(@NonNull Runnable r, long delayMillis) {
  5. return sendMessageDelayed(getPostMessage(r), delayMillis);
  6. }
  7. private static Message getPostMessage(Runnable r) {
  8. Message m = Message.obtain();
  9. m.callback = r;
  10. return m;
  11. }
  1. <a name="jrR1v"></a>
  2. ### 2-3、hasMessage系列方法
  1. public final boolean hasCallbacks(@NonNull Runnable r) {
  2. return mQueue.hasMessages(this, r, null);
  3. }
  4. public final boolean hasMessages(int what) {
  5. return mQueue.hasMessages(this, what, null);
  6. }
  7. public final boolean hasMessages(int what, @Nullable Object object) {
  8. return mQueue.hasMessages(this, what, object);
  9. }
  1. <a name="Q3nS2"></a>
  2. ### 2-4、remove系列方法
  1. /**
  2. * 移除消息
  3. */
  4. public final void removeCallbacks(@NonNull Runnable r) {
  5. mQueue.removeMessages(this, r, null);
  6. }
  7. public final void removeCallbacks(@NonNull Runnable r, @Nullable Object token) {
  8. mQueue.removeMessages(this, r, token);
  9. }
  10. public final void removeMessages(int what) {
  11. mQueue.removeMessages(this, what, null);
  12. }
  13. public final void removeMessages(int what, @Nullable Object object) {
  14. mQueue.removeMessages(this, what, object);
  15. }
  16. public final void removeCallbacksAndMessages(@Nullable Object token) {
  17. mQueue.removeCallbacksAndMessages(this, token);
  18. }
  1. <a name="dYemB"></a>
  2. ### 2-5、总体流程
  3. - 各种发送Message的方法最后调用了sendMessageAtTime,在此方法内部有直接获取MessageQueue然后调用了enqueueMessage方法
  4. - enqueueMessage中msg.target赋值为this,即是当前Handler,然后会调用queue的enqueueMessage的方法,也就是说handler发出的消息,最终会保存到消息队列中去
  5. - 如果大家还记得Looper的loop方法会取出每个msg然后交给msg.target.dispatchMessage(msg)去处理消息,也就是把当前的handler作为msg的target属性
  6. <a name="cXxqg"></a>
  7. ## 3、Handler处理消息
  8. <a name="bziDD"></a>
  9. ### 3-1、消息处理的优先级
  10. - 现在已经很清楚了Looper会调用prepare()和loop()方法,在当前执行的线程中保存一个Looper实例,这个实例会保存一个MessageQueue对象,然后当前线程进入一个无限循环中去,不断从MessageQueue中读取Handler发来的消息。然后再回调创建这个消息的handler中的dispathMessage方法,处理消息有三个,优先级如下
  11. - 优先级1:Message.callback 处理消息,如果不为空,后续的优先级2 3都不会执行
  12. - 优先级2:Handler.mCallbck 处理消息
  13. - 方法返回true,后续的优先级3就不会执行
  14. - 方法返回false,后续的优先级3还会执行
  15. - 优先级3:复写Handler自己实现的消息处理
  1. /**
  2. * 处理消息
  3. * @param msg
  4. */
  5. public void dispatchMessage(@NonNull Message msg) {
  6. if (msg.callback != null) {
  7. handleCallback(msg);
  8. } else {
  9. if (mCallback != null) {
  10. if (mCallback.handleMessage(msg)) {
  11. return;
  12. }
  13. }
  14. handleMessage(msg);
  15. }
  16. }
  17. /**
  18. * Handler的成员方法 空方法,我们可以在创建Handler的时候复写该方法
  19. * @param msg
  20. */
  21. public void handleMessage(@NonNull Message msg) {
  22. }
  1. <a name="USCrm"></a>
  2. ### 3-2、消息处理优先级的代码例子
  3. - 优先级1:Message.callback 处理消息,如果不为空,后续的优先级2 3都不会执行
  1. new Thread(new Runnable() {
  2. @Override
  3. public void run() {
  4. Looper.prepare();
  5. Handler handler = new Handler(Looper.myLooper(),
  6. new Handler.Callback() {
  7. @Override
  8. public boolean handleMessage(@NonNull Message msg) {
  9. Log.d(TAG, "Handler.Callback: "+msg.what);
  10. return false;
  11. }
  12. }){
  13. @Override
  14. public void handleMessage(@NonNull Message msg) {
  15. super.handleMessage(msg);
  16. Log.d(TAG, "Handler.handleMessage: "+msg.what);
  17. }
  18. };
  19. Message msg = Message.obtain(handler, new Runnable() {
  20. @Override
  21. public void run() {
  22. Log.d(TAG, "Message.callback: ");
  23. }
  24. });
  25. msg.what = 10;
  26. handler.sendMessage(msg);
  27. Looper.loop();
  28. }
  29. }).start();

log日志如下: D/MainActivity: Message.callback:

  1. - 优先级2Handler.mCallbck 处理消息
  2. - 方法返回true,后续的优先级3就不会执行
  3. - 方法返回false,后续的优先级3还会执行
  1. new Thread(new Runnable() {
  2. @Override
  3. public void run() {
  4. Looper.prepare();
  5. Handler handler = new Handler(Looper.myLooper(),
  6. new Handler.Callback() {
  7. @Override
  8. public boolean handleMessage(@NonNull Message msg) {
  9. Log.d(TAG, "Handler.Callback: "+msg.what);
  10. return true;
  11. }
  12. }){
  13. @Override
  14. public void handleMessage(@NonNull Message msg) {
  15. super.handleMessage(msg);
  16. Log.d(TAG, "Handler.handleMessage: "+msg.what);
  17. }
  18. };
  19. Message msg = Message.obtain(handler);
  20. msg.what = 10;
  21. handler.sendMessage(msg);
  22. Looper.loop();
  23. }
  24. }).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

  1. - 优先级3:复写Handler自己实现的消息处理
  1. new Thread(new Runnable() {
  2. @Override
  3. public void run() {
  4. Looper.prepare();
  5. Handler handler = new Handler(Looper.myLooper()){
  6. @Override
  7. public void handleMessage(@NonNull Message msg) {
  8. super.handleMessage(msg);
  9. Log.d(TAG, "Handler.handleMessage: "+msg.what);
  10. }
  11. };
  12. Message msg = Message.obtain(handler);
  13. msg.what = 10;
  14. handler.sendMessage(msg);
  15. Looper.loop();
  16. }
  17. }).start();

log日志如下: D/MainActivity: Handler.handleMessage: 10

  1. <a name="o2j8R"></a>
  2. ## 4、Looper/Handler整体流程
  3. - 首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象;因为Looper.prepare()在一个线程中只能调用一次,所以MessageQueue在一个线程中只会存在一个。
  4. - Looper.loop()会让当前线程进入一个无限循环,不端从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。
  5. - Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。
  6. - Handler的sendMessage方法,会给msg的target赋值为handler自身,然后加入MessageQueue中。
  7. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/503653/1616403374774-3f1a6bba-5e21-431e-b157-3116deafc0f4.png#crop=0&crop=0&crop=1&crop=1&height=679&id=Vsybz&margin=%5Bobject%20Object%5D&name=image.png&originHeight=679&originWidth=1135&originalType=binary&ratio=1&rotation=0&showTitle=false&size=458397&status=done&style=none&title=&width=1135)
  8. - 简化代码

public class Handler {

  1. final Looper mLooper;
  2. final MessageQueue mQueue;
  3. /**
  4. * Handler的Callback可以处理消息
  5. */
  6. final android.os.Handler.Callback mCallback;
  7. final boolean mAsynchronous;
  8. public Handler(@Nullable android.os.Handler.Callback callback, boolean async) {
  9. mLooper = android.os.Looper.myLooper();
  10. if (mLooper == null) {
  11. throw new RuntimeException(
  12. "Can't create handler inside thread " + Thread.currentThread()
  13. + " that has not called Looper.prepare()");
  14. }
  15. mQueue = mLooper.mQueue;
  16. mCallback = callback;
  17. mAsynchronous = async;
  18. }
  19. @UnsupportedAppUsage
  20. public Handler(@NonNull Looper looper, @Nullable android.os.Handler.Callback callback, boolean async) {
  21. mLooper = looper;
  22. mQueue = looper.mQueue;
  23. mCallback = callback;
  24. mAsynchronous = async;
  25. }
  26. public final boolean sendMessage(@NonNull Message msg) {
  27. return sendMessageDelayed(msg, 0);
  28. }
  29. public final boolean sendEmptyMessage(int what) {
  30. return sendEmptyMessageDelayed(what, 0);
  31. }
  32. public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {
  33. Message msg = Message.obtain();
  34. msg.what = what;
  35. return sendMessageDelayed(msg, delayMillis);
  36. }
  37. public final boolean post(@NonNull Runnable r) {
  38. return sendMessageDelayed(getPostMessage(r), 0);
  39. }
  40. public final boolean postDelayed(@NonNull Runnable r, long delayMillis) {
  41. return sendMessageDelayed(getPostMessage(r), delayMillis);
  42. }
  43. private static Message getPostMessage(Runnable r) {
  44. Message m = Message.obtain();
  45. m.callback = r;
  46. return m;
  47. }
  48. public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {
  49. if (delayMillis < 0) {
  50. delayMillis = 0;
  51. }
  52. return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
  53. }
  54. public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {
  55. MessageQueue queue = mQueue;
  56. if (queue == null) {
  57. RuntimeException e = new RuntimeException(
  58. this + " sendMessageAtTime() called with no mQueue");
  59. Log.w("Looper", e.getMessage(), e);
  60. return false;
  61. }
  62. return enqueueMessage(queue, msg, uptimeMillis);
  63. }
  64. /**
  65. * 消息加入消息队列
  66. * @param queue
  67. * @param msg
  68. * @param uptimeMillis
  69. * @return
  70. */
  71. private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg,
  72. long uptimeMillis) {
  73. // msg的target就是Handler自己
  74. msg.target = this;
  75. msg.workSourceUid = ThreadLocalWorkSource.getUid();
  76. if (mAsynchronous) {
  77. msg.setAsynchronous(true);
  78. }
  79. return queue.enqueueMessage(msg, uptimeMillis);
  80. }
  81. /**
  82. * 判断消息队列中是否有该消息
  83. */
  84. public final boolean hasCallbacks(@NonNull Runnable r) {
  85. return mQueue.hasMessages(this, r, null);
  86. }
  87. public final boolean hasMessages(int what) {
  88. return mQueue.hasMessages(this, what, null);
  89. }
  90. public final boolean hasMessages(int what, @Nullable Object object) {
  91. return mQueue.hasMessages(this, what, object);
  92. }
  93. /**
  94. * 移除消息
  95. */
  96. public final void removeCallbacks(@NonNull Runnable r) {
  97. mQueue.removeMessages(this, r, null);
  98. }
  99. public final void removeCallbacks(@NonNull Runnable r, @Nullable Object token) {
  100. mQueue.removeMessages(this, r, token);
  101. }
  102. public final void removeMessages(int what) {
  103. mQueue.removeMessages(this, what, null);
  104. }
  105. public final void removeMessages(int what, @Nullable Object object) {
  106. mQueue.removeMessages(this, what, object);
  107. }
  108. public final void removeCallbacksAndMessages(@Nullable Object token) {
  109. mQueue.removeCallbacksAndMessages(this, token);
  110. }
  111. /**
  112. * 处理消息
  113. * @param msg
  114. */
  115. public void dispatchMessage(@NonNull Message msg) {
  116. if (msg.callback != null) {
  117. handleCallback(msg);
  118. } else {
  119. if (mCallback != null) {
  120. if (mCallback.handleMessage(msg)) {
  121. return;
  122. }
  123. }
  124. handleMessage(msg);
  125. }
  126. }
  127. /**
  128. * Handler的成员方法 空方法,我们可以在创建Handler的时候复写该方法
  129. * @param msg
  130. */
  131. public void handleMessage(@NonNull Message msg) {
  132. }

} ```