【Android自助餐】Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉

  • Android自助餐Handler消息机制完全解析一Message中obtain与recycle的来龙去脉
    • 提供obtain
    • 回收recycle

提供obtain()

在obtain的所有重载方法中,第一行都是Message m = obtain();,即调用空参的方法。
先来看一下这个空参方法

public static Message obtain() {    synchronized (sPoolSync) {        if (sPool != null) {            Message m = sPool;            sPool = m.next;            m.next = null;            m.flags = 0; // clear in-use flag            sPoolSize--;            return m;        }    }    return new Message();}

很明显,这是个同步方法,sPoolSync即锁对象,该对象在定义时即被初始化private static final Object sPoolSync = new Object();,随后便只读不写。
然后便是sPool,后面还有Message m = sPool;sPool = m.next;,很明显可以看出来,这是一个链表结构。sPool指向当前message,next指向下一个message。
在解释这段代码前,需要先明确两点:sPool声明为private static Message sPool;next声明为/*package*/ Message next;。即前者为该类所有示例共享,后者则每个实例都有。
现在为了便于理解,我们将Message抽象为C语言中的链表节点结构体,指针域便是用于指向下一个消息的next字段,其他则都视为数据域。
假设该链表初始状态如下
初始状态
执行Message m = sPool;就变成下图
【Android自助餐】Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉_第1张图片
继续sPool = m.next;
【Android自助餐】Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉_第2张图片
然后m.next = null;
【Android自助餐】Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉_第3张图片
接下来m.flags=0;sPoolSize--;return m;便是表示m指向的对象已经从链表中取出并返回了。

回收recycle()

然后再看看sPoolSize是什么时候自增的。按图索骥便可找到recycle()方法和recycleUnchecked()方法。前者供开发者调用进行回收,后者执行回收操作。来看看回收操作都干了啥:

void recycleUnchecked() {    // Mark the message as in use while it remains in the recycled object pool.    // Clear out all other details.    flags = FLAG_IN_USE;    what = 0;    arg1 = 0;    arg2 = 0;    obj = null;    replyTo = null;    sendingUid = -1;    when = 0;    target = null;    callback = null;    data = null;    synchronized (sPoolSync) {        if (sPoolSize < MAX_POOL_SIZE) {            next = sPool;            sPool = this;            sPoolSize++;        }    }}

前半段不必多说,显然是“重置”改对象的个个字段。后半段又是一个同步代码段,同样用图来解释一下(假设当前代码为message.recycle(),则需要被回收的则是message对象)。
假设当前链表如下:
初始状态
执行next=sPool;
【Android自助餐】Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉_第4张图片
执行sPool=this;
【Android自助餐】Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉_第5张图片
现在可以很清楚的看到,Message类本身就组织了一个栈结构的缓冲池。并使用obtain()方法和recycler()方法来取出和放入。

更多相关文章

  1. Android 操作系统的内存回收机制
  2. Android 事件分发机制总结
  3. 【幻灯片分享】Android消息推送实现 | 友盟 徐仙明 | Android De
  4. android应用安全——签名机制
  5. Android事件处理方法总结-Handler消息处理
  6. 比较详细的handle机制

随机推荐

  1. Android对返回键进行处理的方式
  2. Android应用程序获取ROOT权限的方法
  3. Android EventBus 通信
  4. Android(安卓)Studio目录结构浅析
  5. Android 进行单元测试难在哪-终
  6. 帧动画和补间动画
  7. android sdk Content Loader's has encou
  8. Mac系统下Android SDK更新以及ADT无法在
  9. Android下动态获取View的高度或宽度
  10. Android用户界面布局(layouts)