Android面试:Handler中sendMessage与post Runnable的区别

157 阅读1分钟

对于这个问题其实还是比较简单的,我们在平时的开发中确实会经常调用这两个方法,但是我们并没有关注这个问题,所以在面试的时候突然问到这个问题大家还是会感觉到无从回答。

原因

需要知道它们之间的区别,我们简单的从源码中寻找答案吧,这样比较直接,对应Handler的方法如下:

  public final boolean post(Runnable r)
  {
     return  sendMessageDelayed(getPostMessage(r), 0);
   }

  /**获取message,同时设置callback**/
  private static Message getPostMessage(Runnable r) 
  {
      Message m = Message.obtain();
      m.callback = r;
      return m;
  }
  
   /***普通的send message方法**/
  public final boolean sendMessage(Message msg)
  {
      return sendMessageDelayed(msg, 0);
  }

调用MessageQueue、Looper等方法之后,最值执行的方法如下:

public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

上面的执行方法首先判断msg对象是否包含callback对象,如果我们使用了Handler.post() 方法这里就会命中第一个判断条件。

答案

上面分析了那么多,其实我们比较清晰的知道了它们之间的调用区别了,我们还没有回答面试官的问题,所以我们这里简单做一下答案的总结:

  1. 这两个方法都是利用Handler发送消息,让Handler帮助我们处理这些消息(相同点);
  2. sendMessage的消息会在handleMesage或者Callback中被接收并处理,而post runnable方法是直接调用run()方法进行执行处理(不同点);
  3. 使用post()方法更加方便,同时会让我们更加清晰执行的代码逻辑(不同点);