【Android消息处理机制】Handler中sendEmptyMessage与sendMessage的区别和sendMessageAtTime()与sendEmptyMessageDelay()区别
2017-03-06 11:55
627 查看
本文转载自:http://blog.csdn.net/cangchen/article/details/44489023
其实两者没区别,请看下面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()而已,下面看下这个方法:[java] view plain copy /**
* 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)的实现和上面一样,请看:
[java] view plain copy /**
* 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.
函数原型: public boolean sendMessageAtTime (Message msg, long uptimeMillis) Message //不用说 是待发送消息uptimeMillis //sendMessageAtTime,即在确定的时间发送这个消息,这个时间通过这个参数指定这个时间由uptimeMillis()传递 这两句是等效的,都是延时1秒将消息加入列队msgHandle.sendMessageAtTime(msg, SystemClock.uptimeMillis()+1000);msgHandle.sendMessageDelayed(msg, 1000) sendMessageAtTime的uptimeMillis是相对系统开机时间的绝对时间,SystemClock.uptimeMillis()是当前开机时间。
1、sendEmptyMessage与sendMessage的区别:
sendMessage()允许你处理Message对象(Message里可以包含数据,)。
sendEmptyMessage(int what)只能放数据。其中参数what作用:就类似于ID,处理消息的时候用于区分你send一个0和1,处理的时候就要判断了if(msg.what == 0){}else if(msg.what == 1){}。
其实两者没区别,请看下面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()而已,下面看下这个方法:[java] view plain copy /**
* 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)的实现和上面一样,请看:
[java] view plain copy /**
* 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.
2、sendMessageAtTime()与sendEmptyMessageDelay()的区别:
函数原型: public boolean sendMessageAtTime (Message msg, long uptimeMillis) Message //不用说 是待发送消息uptimeMillis //sendMessageAtTime,即在确定的时间发送这个消息,这个时间通过这个参数指定这个时间由uptimeMillis()传递 这两句是等效的,都是延时1秒将消息加入列队msgHandle.sendMessageAtTime(msg, SystemClock.uptimeMillis()+1000);msgHandle.sendMessageDelayed(msg, 1000) sendMessageAtTime的uptimeMillis是相对系统开机时间的绝对时间,SystemClock.uptimeMillis()是当前开机时间。
相关文章推荐
- 【Android消息处理机制】Handler中sendEmptyMessage与sendMessage的区别和sendMessageAtTime()与sendEmptyMessageDelay()区
- 【Android消息处理机制】Handler中sendEmptyMessage与sendMessage的区别和sendMessageAtTime()与sendEmptyMessageDelay()区别
- 【Android消息处理机制】Handler中sendEmptyMessage与sendMessage的区别和sendMessageAtTime()与sendEmptyMessageDelay()区别
- 【移动开发】Handler的sendMessageAtTime()和sendEmptyMessageDelay()区别
- android的Handler中sendEmptyMessage与sendMessage的区别
- android的Handler中sendEmptyMessage与sendMessage的区别
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Handler 的sendEmptyMessage(int what)和sendMessage(Message msg)有啥区别?
- Android消息处理机制:Handler Thread Message Looper
- Android的消息处理机制(图+源码分析)——Looper,Handler,Message
- handle.sendEmptyMessageDelayed(message ,TIME_OUT) 发送延迟处理的消息
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android消息处理机制(Looper,Handler,Message)
- Android消息处理机制:Handler Thread Message Looper
- android的消息处理机制(图文+源码分析)―Looper/Handler/Message