您的位置:首页 > 移动开发 > Android开发

Android Message.obtain() 和Handler.obtainMessage()的区别

2017-04-11 17:10 549 查看


转载地址:


类概述

 

定义一个包含任意类型的描述数据对象,此对象可以发送给Handler。对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作。

尽管Message的构造器是公开的,但是获取Message对象的最好方法是调用Message.obtain()或者Handler.obtainMessage(), 这样是从一个可回收对象池中获取Message对象。

 


1、首先创建Handler对象:

private Handler mHandler = new Handler() {  

  

        public void handleMessage(android.os.Message msg) {  

            switch (msg.what) {  

            case 1:  

                textShowTV.setText("展示中...");  

                break;  

            }  

        };  

          

    };  

 


2、然后是消息处理:

            //①,使用new Message()  

//          Message mess = new Message();  

            //②,使用Message.obtain()  

            Message mess = Message.obtain();  

            mess.what =1;  

            //mHandler.obtainMessage(1)与上两行的代码一样,可以参考源码查看  

//          Message mess = mHandler.obtainMessage(1);  

            mHandler.sendMessage(mess);  

 

通过比较我们会发现,这两种获取Message的实例的方法不一样,于是我看了源码,果然不一样:

 



进入obtain方法:

 

图1:



 


进入Message方法:

 

图2:



 

 

查看obtainMessage()源码:

 
图3:



   
 

查看Message.obtain(this, what) 源码:

图4:
 




然后,再次点击obtain() 方法,代码又回归到了图1

 


总结:

 

上面的图1中obtain方法的注释中说得很明白:从整个Messge池中返回一个新的Message实例,在许多情况下使用它,因为它能避免分配新的对象

 

如果是这样的话,那么通过调用obtainMessage方法获取Message对象就能避免创建对象,从而减少内存的开销了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐