我们学习Handler的时候会发现,Handler就是通过把我们需要传递的消息封装到Message中,然后发送Message来实现线程间通信的。
目录
1、Message message = new Message()
2、Message message = Message.obtain()
3、Message message = mhandler.obtainMessage()
一、Message的三种初始化方法:
1、Message message = new Message()
直接新创建一个Message对象。
2、Message message = Message.obtain()
从Message.obtain()方法的解释中可以明白obtain方法会从全局池里返回一个新的Message实例,允许我们在很多情况下避免分配新的对象。从方法的实现中可以看出,如果Message池中sPool不为空,就会返回一个实例,否则就重新new一个新的实例。
第一次使用的时候,由于Message池中并没有Message实例,所以会执行new Message来创建新的实例。
如果Message池中有实例,在返回当前的实例后,sPool会指向Message池的下一个Message,并且池的大小会减一。
/**
* Return a new Message instance from the global pool. Allows us to
* avoid allocating new objects in many cases.
*/
public static Message obtain() {
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0; // clear in-use flag
sPoolSize--;
return m;
}
}
return new Message();
}