美文网首页
2018-08-02 mHandler的sendMessage和

2018-08-02 mHandler的sendMessage和

作者: 橙柏 | 来源:发表于2018-08-02 15:51 被阅读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();
   }
  • 其中nextMessage队列里的下一个Message对象用next指向下一条Message,实现一个链表数据结构,用户一般使用不到该字段。
  • a++ 先返回a,再自加
    ++a 先自加,再返回a
    如a=3
    b=a++;//b=3
    c=++a;//c=5

  • 查看sPool
    private static Message sPool;

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

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

相关文章

网友评论

      本文标题:2018-08-02 mHandler的sendMessage和

      本文链接:https://www.haomeiwen.com/subject/elfsvftx.html