2018-08-02 mHandler的sendMessage和

2018-08-02  本文已影响0人  橙柏

在进行线程间通信的时候,用到mHandler发送一段信息,在之前的学习过程中,一般是用mHander.sendMessage来发送:

sendMessage()
Messagemsg=newMessage()
msg.what=xxx;
msg.arg1=xxx;
msg.arg2=xxx;
handler.sendMessage(msg);

后来在同事的代码中发现可以用obtainMessage() 来发送
感觉写法很简单.

publicvoidupgradeProcessCmd(byte[]b) {
 Messagemessage=mEventHandler.obtainMessage(EventUtils.HANDLER_SEND_BOCHE,b);
    mEventHandler.sendMessage(message);
    }

为什么两种写法都可以,或者说为什么同一个功能为什么Android 会提供两种写法,其中一定有缘由

查看源码

publicfinalMessageobtainMessage(intwhat,Objectobj) {
      returnMessage.obtain(this,what,obj);
 }

obtain()方法

public static Message obtain(Handlerh,intwhat) {
    Message m=obtain();
    m.target=h;
    m.what=what;
    return m;
 }

mMessage ()

publicstaticMessageobtain() {
    Objectvar0=sPoolSync;
    synchronized(sPoolSync) {
        if(sPool!=null) {
          Message m=sPool;
          sPool=m.next;
          m.next=null;
          --sPoolSize;
          return m;
           }
        }
      return new Message();
   }

总的来说就是不会创建新的messgae对象,一直从spool拿。省去了创建对象申请内存的开销。
相比较于前者,不会创建多个Message对象,而且写法简单,所以会一般用后者

参考博客https://blog.csdn.net/h3c4lenovo/article/details/7914902
这里比较逗,参考的博客是照搬别人的。

上一篇 下一篇

猜你喜欢

热点阅读