handler.obtainMessage()
用过Handler的人都知道,Message有两种获取方法Message msg = new Message();
或者
Message msg = handler.obtainMessage();
这两种方法的区别是,前者是new的,需要开辟内存空间;后者是从global Message pool中取,性能消耗相对少;
我想问的是,global Message pool的概念?
我在程序中并没有创建过Message,可以使用obtainMessage()方法来获取Message对象吗?如果可以,那这个取到的Message是哪儿来的?
使用obtainMessage()既然没有new,那么我obtainMessage得到的Message就可能是同一个,如果线程A通过handler.obtainMessage()得到了message,并且把相关属性赋值了,然后通过sendMessage加入到主线程中,主线程正要去取这个message里的相关信息,还没取,线程A由于运行频率较高又get了一遍,又赋上了新值.
或者还有一个线程,线程B也get,也赋值了一遍.
那么你的主线程数据就完全乱套了.
--------------------编程问答-------------------- 源码:
public static Message obtain() {
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
sPoolSize--;
return m;
}
}
return new Message();
}
个人认为是从系统中获取有限的Message,提高性能,如果pool中没有Message就实例化一个。 --------------------编程问答-------------------- 系统初始化一个Message Pool 提高效率。 --------------------编程问答--------------------
我觉得new Message()的存在肯定有必不可少的地方,有些情况下必须使用new Message(),不然就不会开放这个方法了,直接去除岂不更好。。现在很想知道什么情况下会必须用new Message()而不能obtainMessage
--------------------编程问答-------------------- obtain方法里边不是用到同步锁了吗?所以不会乱吧? --------------------编程问答--------------------
确定了再发表言论,“吧”,到底是还不是呢?。。对于程序员,这相当于没说啊
补充:移动开发 , Android