【Android消息处理机制】Handler中sendEmptyMessage与sendMessage的区别和sendMessageAtTime()与sendEmptyMessageDelay()区别

    xiaoxiao2026-05-17  8

    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()是当前开机时间。
    转载请注明原文地址: https://ju.6miu.com/read-1309765.html
    最新回复(0)