zoukankan      html  css  js  c++  java
  • Handler 的sendEmptyMessage(int what)和sendMessage(Message msg)有啥区别?

        做一个手机助手查看器,碰到里面的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.

      如果对Handler机制要深入了解的,请参考上面那位大三“老师”的博客文章:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html

  • 相关阅读:
    基于边缘计算网关的桥梁结构安全监测应用
    5G工业网关的边缘计算
    5G工业网关和5G工业路由器差异对比分析
    大型网站架构系列:消息队列(二)
    大型网站架构系列:分布式消息队列(一)
    [转]线程安全类的设计
    [转]runloop原理
    [转]深入理解RunLoop
    [转]iOS保持界面流畅的技巧和AsyncDisplay介绍
    [转]面试时如何优雅的谈论OC
  • 原文地址:https://www.cnblogs.com/wangsanfeng/p/2751641.html
Copyright © 2011-2022 走看看