您的位置:首页 > 其它

sendemptymessage 和sendmessage的区别

2015-12-08 12:03 525 查看
做一个手机助手查看器,碰到里面的Handler用sendEmptyMessage(int what)发消息,其实也可以用sendMessage(Message msg)的,但两者到底有啥区别?GOOGLE一下,没有看到什么好的答案,倒是看到一个大三的家伙有模有样的分析起来了安卓类的源代码,SHIT,此刻的我真是汗颜,不过老子说得好嘛---故师者,无长无优,闻道有先后而已。哦,记错了,是韩愈说的。收到了启发,也开始看起类的源代码起来。

   其实两者没区别,请看下面Handler的源代码:

    

/**

* Sends a Message containing only the what value.



* @return Returns true if the message was successfully placed in to the 

* message queue. Returns false on failure, usually because the

* looper processing the message queue is exiting.

*/

public final boolean sendEmptyMessage(int what)

{

   return sendEmptyMessageDelayed(what, 0);

}

就是调用了sendEmptyMessageDelayed()而已,下面看下这个方法:

/**

* Sends a Message containing only the what value, to be delivered

* after the specified amount of time elapses.

* @see #sendMessageDelayed(android.os.Message, long) 



* @return Returns true if the message was successfully placed in to the 

* message queue. Returns false on failure, usually because the

* looper processing the message queue is exiting.

*/

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

Message msg = Message.obtain();

msg.what = what;

return sendMessageDelayed(msg, delayMillis);

}

而sendMessage(Message msg)的实现和上面一样,请看:

/**

* Pushes a message onto the end of the message queue after all pending messages

* before the current time. It will be received in {@link #handleMessage},

* in the thread attached to this handler.



* @return Returns true if the message was successfully placed in to the 

* message queue. Returns false on failure, usually because the

* looper processing the message queue is exiting.

*/

public final boolean sendMessage(Message msg)

{

return sendMessageDelayed(msg, 0);

}

原来在sendEmptyMessageDelayed中就是构建了一个Message,然后把这个Message的what设置成sendEmptyMessage方法中的What参数即可。

  一切恍然大悟!

  然后,在主线程中,Looper类的loop()通过 调用: msg.target.dispatchMessage(msg),调用Hanler类的dispatchMessage(Message msg)方法,从而在主线程中处理了这个Message.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: