android 中 Message详解

当你去面试的时候,会不会有人好会问到你,android中Message有几种创建方式,他们的异同,Message池最多可放多少?

一、首先说一下Message的几种创建方式

  1. 一般情况,都是直接创建Message实例对象 Message msg = new Message();这种方式就不必多说了,大家都懂的。

  2. Message.obtain();打开源码查看具体实现:
    从方法注释不难看出,这个方法不会重复创建Message实例对象,而是直接从Message池中获取一个Message的新的实例对象,避免重复创建多个实现对象。

虽然Message提供了一个公共方法来共造实例,但是最好的方式是调用Message.obtain()来获取,因为当它被回收时会被放入一个对象池中。

next保存的是下一个可以使用的Message对象,当sPool被使用后,sPool将会指向next,而next被置null,这不就是数据结构中的一个链表吗?也就是说Message池是通过一个链表来实现的!
当第一次调用Mesage.obtain()方法时,sPool肯定是null,所以会new一个Message对象,所以obtain()方法是不会返回为null的,放心使用。
当sPool!=null时,这个时候使用的就是Message池的链表头sPool对象了,然后sPool指向下一个next消息,可用Message数量减一,同时设置message使用标志。

3.Message.obtain(handler)、Message.obtain(handler,1);…进入Message源码,可以看见多个这样的方法,只是传入得参数不同,就不一一写了,这个方法其实也是调用了第二种Message的创建方式:


如果使用第三种方式,则消息的发送可以直接写为
Message.obtain(handler).sendToTarget(); 打开Message源码查看sendToTarget方法

其中target就是你传进去的handler对象,其实就是调用的handler的sendMessage方法;

二、Message池到底可以放多少Message对象进去呢?

终于知道了,原来最多可以放50;

所以在学习android的过程中查看源码是必不可少的一个经过,多看源码多去理解源码的实现过程与细节,这样也会很快的进步。

更多相关文章

  1. QtAndroid详解(3):startActivity实战Android拍照功能
  2. AsyncTask 学习翻译并总结
  3. 子线程新建Handler为什么会报错?——浅谈Handler、Looper、Messag
  4. 一份关于 Java、Kotlin 与 Android(安卓)的学习笔记
  5. Android代码内存优化建议-Android资源篇
  6. android中handler案例
  7. 浅谈Java中Collections.sort对List排序的两种方法
  8. 类和 Json对象
  9. Python list sort方法的具体使用

随机推荐

  1. Android(安卓)仿3g体育门户客户端赛事图
  2. EditText在输入法上显示搜索按钮
  3. 2011.09.22——— android ViewStub的简
  4. android常用代码片段
  5. android 不自动弹出虚拟键盘
  6. Android应用程序组件Content Provider的
  7. ubuntu 11.10 搭建 Android(安卓)开发环
  8. android framework
  9. Basic4android (Basic for Android) - Ra
  10. App 权限一点知识