当前位置:编程学习 > wap >>

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 提高效率。 --------------------编程问答--------------------
引用 2 楼 birdsaction 的回复:
系统初始化一个Message Pool 提高效率。


我觉得new Message()的存在肯定有必不可少的地方,有些情况下必须使用new Message(),不然就不会开放这个方法了,直接去除岂不更好。。现在很想知道什么情况下会必须用new Message()而不能obtainMessage
--------------------编程问答-------------------- obtain方法里边不是用到同步锁了吗?所以不会乱吧? --------------------编程问答--------------------
引用 4 楼 JackingNo1 的回复:
obtain方法里边不是用到同步锁了吗?所以不会乱吧?



确定了再发表言论,“吧”,到底是还不是呢?。。对于程序员,这相当于没说啊
补充:移动开发 ,  Android
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,