Android Message和obtainMessage的区别

类概述

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

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

1、首先创建Handler对象:

[java] view plaincopy
  1. private Handler mHandler = new Handler() {
  2. public void handleMessage(android.os.Message msg) {
  3. switch (msg.what) {
  4. case 1:
  5. textShowTV.setText("展示中...");
  6. break;
  7. }
  8. };
  9. };

2、然后是消息处理:

[java] view plaincopy
  1. //①,使用new Message()
  2. //          Message mess = new Message();
  3. //②,使用Message.obtain()
  4. Message mess = Message.obtain();
  5. mess.what =1;
  6. //mHandler.obtainMessage(1)与上两行的代码一样,可以参考源码查看
  7. //          Message mess = mHandler.obtainMessage(1);
  8. mHandler.sendMessage(mess);
通过比较我们会发现,这两种获取Message的实例的方法不一样,于是我看了源码,果然不一样:

进入obtain方法:

图1:

进入Message方法:

图2:

查看obtainMessage()源码:

图3:

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

图4:

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

总结:

上面的图1中obtain方法的注释中说得很明白:从整个Messge池中返回一个新的Message实例,在许多情况下使用它,因为它能避免分配新的对象
如果是这人的话,那么通过调用obtainMessage方法获取Message对象就能避免创建对象,从而减少内存的开销了。

Android Message和obtainMessage的区别相关推荐

  1. Message创建方式:new Message和obtainMessage的区别

    前言 创建Message对象的时候,有三种方式,分别为: 1.Message msg = new Message(); 2.Message msg2 = Message.obtain(); 3.Mes ...

  2. Android Handler Message 里面的message.what, message.arg1,message.obj,obtainMessage, message.setData的使用

    Android Handler Message 里面的message.what, message.arg1,message.arg2,message.obj,obtainMessage, messag ...

  3. android @id和@+id的区别

    今天,简单讲讲android里关于@id和@+id的区别. 之前,自己在布局里无论什么情况都使用@+id,可是后来发现有些代码用的是@id,自己不知道这两者之间有什么区别.于是就在网上查找资料,最终是 ...

  4. Android版本dp,Android中sp和dp区别

    --- title: Android中sp和dp区别 date: 2016-09-08 17:04:15 tags: Android categories: Android开发 --- ## 理解an ...

  5. android中src和background区别

    android中src和background区别 ImageView中XML属性src和background的区别: background会根据ImageView组件给定的长宽进行拉伸,而src就存放 ...

  6. Android各个版本API的区别

    Android各个版本API的区别 Android 1.5 API变更概要: 1.UI framework · Framework for easier background/UI thread in ...

  7. 浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解

    浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解 本篇文章小编为大家介绍,Android onTouchEvent 与 onInterceptTo ...

  8. android 组件的id,Android@id和@+id的区别 - 泡在网上的日子

    Android中的组件需要用一个int类型的值来表示,这个值就是组件标签中的id属性值. id属性只能接受资源类型的值,也就是必须以@开头的值,例�[email protected]/abc.@+id ...

  9. Android之startService()和bindService()区别

    Android之startService()和bindService()区别 1. 生命周期: 执行startService时,Service会经历onCreate->onStartComman ...

最新文章

  1. LeetCode刷题记录4——67. Add Binary(easy)
  2. 网站服务器停止响应,如何解决apache停止响应的问题
  3. 我在实际工作中用的最多的 git 命令,全在这里了,使用简单!
  4. 安卓进阶系列-02搜索框(PersistentSearch)的使用
  5. 数据结构与算法 | 循环队列
  6. C#操作Cookie
  7. matlab表示DFT和DTFT,【 MATLAB 】离散傅里叶级数(DFS)与DFT、DTFT及 z变换之间的关系...
  8. (16)Zynq FPGA SD控制器介绍
  9. python传递类的实例_使用Python将变量从一个类实例传递到另一个类实例?
  10. 845. 数组中的最长山脉
  11. 【大数据】0001---使用SparkSQL关联两个表求和取前几行
  12. 怎么修改图片大小尺寸?
  13. LINUX内核编译选项-4
  14. Android支付宝刷步数,蚂蚁森林刷步数小技巧(一键修改支付宝步数)
  15. AOP底层实现原理、基于注解的AOP编程、AOP开发中的一个坑 打卡第八天
  16. mysql raw_rails - 直接执行raw sql. 查询mysql的基本数据
  17. 原生Js弹窗插件|web弹出层组件|对话框
  18. 去哪儿12306候补购票怎么用?
  19. Webpack 使用
  20. Laravel Excel实现Excel/CSV文件导入导出的功能详解(合并单元格,设置单元格样式)

热门文章

  1. directdraw显示yuv视频,出现屏保时,yuv显示不出来,表面丢失
  2. zabbix 如何监控tcp的SYN,establised?
  3. 自定义WP日志标题长度
  4. 前端开发-跨浏览器测试工具
  5. Android 与 JavaScript 相互调用桥梁 JSBridge
  6. mysql更新一条语句_讲讲一条MySQL更新语句是怎么执行的?
  7. Atlassian JIRA 插件开发之三 创建
  8. Linux/Unix 多线程通信
  9. 6.表单提交,input键盘变搜索,有关自定义属性input操作
  10. explain和profiling分析查询SQL时间