在进行线程间通信的时候,用到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
这里比较逗,参考的博客是照搬别人的。