Handler sendMessage 与 obtainMessage (sendToTarget)斗劲

话说在工作中第一次接触android 的Handler 的时辰,不知道怎么去存眷机能。


记得当时这么写的:



Message msg = new Message()

msg.what = xxx;

msg.arg1  = xxx;

msg.arg2  = xxx;

handler.sendMessage(msg);


如许写也没有绝得不好,反合法时项目标功能实现了。(机能上还可以)


后来没事的时辰看了看handler 的其他的办法,就看到了obtainMessage()这个办法.很新鲜,不知道为何还要出来的办法


底本上方的那段code 就能实现handler 的功能了,为什么还要呈现他,后来百度google 一把,大师说 什么机能上有差别之


类的。。。。。成果可想而知(大项目组的文章都是你抄我的我抄你的,技巧就是如许出来的。。鄙夷这种抄写别人博客文章而


不有名转载出处的人)。于是我就去看源码可否看到一些好的描述。



Message msg = handler.obtainMessage();

msg.what = xxx;

msg.arg1  = xxx;

msg.arg2  = xxx;

msg.obj    = xxx;



.................... 


看看这两段代码其实就是办法不一样 ,参数都一样。然则为何实现的结果一样还要分别出来这么多办法呢?


到源码去看个毕竟吧!


先去看sendMessage()这个办法。。。。它调用的是Handler 中的sendMessage(Message msg)


源码 片段1  如下:



/**

     * 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);

    }



 再看handler.obtainMessage()源码 片段2 如下:



 /**

     * Returns a new {@link android.os.Message Message}  the global message pool. 
   * More efficient than creating and allocating new instances. 
    * The retrieved message has its handler set to this instance    
   * (Message.target == this).

     * If you don""t want that facility, just call Message.obtain() instead.

     */

   



    public final Message obtainMessage()

    {

        return Message.obtain(this);

    }



  


上方这两段都是Handler 里面的办法,不过在片段1  我们可以看到Message是我们作为参数传畴昔的,片段2的则是我们


Message帮我们处理惩罚,它调用obtain(Handler h)办法,之后我们还要调用Message中sendToTarget()这个办法。


看一下Message.obtain(Hanlder h) 的源码  代码片段3如下:



  /**

     * Same as {@link #obtain()}, but sets the value for the <em>target</em> member on the Message return   * ed.

     * @param h  Handler to assign to the returned Message object""s <em>target</em> member.

     * @return A Message object  the global pool.

     */

    public static Message obtain(Handler h) {

        Message m = obtain();

        m.target = h;



        return m;

    }



  再看 sendToTarget() 源码     代码片段4 如下:



  /**

     * Sends this Message to the Handler specified by {@link #getTarget}.

     * Throws a null pointer exception if this field has not been set.

     */

    public void sendToTarget() {

        target.sendMessage(this);

    }



  这里的target就是handler,sendToTarget()又在调用handler的 sendMessage 办法了。。。


     看到这里也许有的人很困惑,如许转来转去,转了一圈怎么又回到Handler的 sendMessage办法了?那么机能斗劲一说


     还有其他的证据么?(莫非调用的办法多机能就低么?也许有这么一点原因,不过这里几乎可以不推敲这一点机能损耗的)


     那么机能的斗劲证据应当从哪里找呢?


 


  其实细心的同窗已经看到了,重视看源码的注释,


/**
* Returns a new {@link android.os.Message Message} the global message pool. More efficient than
* creating and allocating new instances. The retrieved message has its handler set to this instance (Message.target == this).
* If you don""t want that facility, just call Message.obtain() instead.
*/


    这里我们的Message 已经不是 本身创建的了,而是从MessagePool 拿的,省去了创建对象申请内存的开销。。。。。


   到这里大师应当都熟悉打听了。所以今后应用的时辰尽量应用 Message msg = handler.obtainMessage();的情势创


   建Message,不要本身New Message 至于message产生之后你应用obtainMessage 或者是 sendMessage 效力影响


   并不大.同时我们也要重视今后谈论机能的时辰要找准地位,譬如这里机能的题目不是在调用 obtainMessage 和 sen


  dMessage 的办法上,而是调用他们之前对象的创建题目上。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值