obtainmessage()是从消息池中拿来一个msg,不需要另外开辟空间,可以循环利用;
new message需要重新申请空间,效率低.
- //use Handler.obtainMessage(),instead of msg = new Message();
- //because if there is already an Message object,that not be used by
- //any one ,the system will hand use that object,so you don't have to
- //create and object and allocate memory.
- //it is also another example of object recycling and reusing in android.
- Message msg = mHandler.obtainMessage();
- msg.what = UPDATE_LISTVIEW;
- msg.obj = current + "/" + total + "songs";
- //this method is called from worker Thread,so we cannot update UI from here.
- msg.sendToTarget();
在看下面代码:
- Message msg = handler.obtainMessage();
- msg.arg1 = i;
- msg.sendToTarget();
- Message msg=new Message();
- msg.arg1=i;
- handler.sendMessage(msg);
-
- Message msg = Messge.obtain();
-
msg.arg1=i; - handler.sendMessage(msg);
第一种写法是message 从handler 类获取,从而可以直接向该handler 对象发送消息,第二种写法是直接调用 handler 的发送消息方法发送消息.所以获取Message对象的最好方法,但是获取Message对象的最好方法是调用Message.obtain()或者Handler.obtainMessage(),
这样是从一个可回收对象池中获取Message对象。
部分源码分析:
进入obtain()方法:
图1:
进入Message()方法:
图2:
查看obtainMessage()源码:
图3:
查看Message.obtain(this, what) 源码:
具体可参考:http://blog.csdn.net/imdxt1986/article/details/7041570
http://blog.csdn.net/duqiuke/article/details/39577413