对于这个问题其实还是比较简单的,我们在平时的开发中确实会经常调用这两个方法,但是我们并没有关注这个问题,所以在面试的时候突然问到这个问题大家还是会感觉到无从回答。
原因
需要知道它们之间的区别,我们简单的从源码中寻找答案吧,这样比较直接,对应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() 方法这里就会命中第一个判断条件。
答案
上面分析了那么多,其实我们比较清晰的知道了它们之间的调用区别了,我们还没有回答面试官的问题,所以我们这里简单做一下答案的总结:
- 这两个方法都是利用Handler发送消息,让Handler帮助我们处理这些消息(相同点);
- sendMessage的消息会在handleMesage或者Callback中被接收并处理,而post runnable方法是直接调用run()方法进行执行处理(不同点);
- 使用post()方法更加方便,同时会让我们更加清晰执行的代码逻辑(不同点);