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

原创 2016年07月13日 20:42:31

【Android自助餐】Handler消息机制完全解析(一)Message中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;就变成下图
Message m = sPool
继续sPool = m.next;
sPool = m.next
然后m.next = null;
m.next = null
接下来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;
next=sPool
执行sPool=this;
sPool=this
现在可以很清楚的看到,Message类本身就组织了一个栈结构的缓冲池。并使用obtain()方法和recycler()方法来取出和放入。

版权声明:博主原创文章,转载注明出处!

【Android 开发】: Android 消息处理机制之二: Message 中 obtain()源代码剖析

在上一讲中[Android消息处理机制之Handler与Message],我们学习了Handler类与Message类的大概介绍,同事也遗留了一个问题,在获取Message对象的时候是不能用 "new...
  • xukunhui2
  • xukunhui2
  • 2013年11月28日 22:29
  • 26431

Handler.obtainMessage()

转自:http://www.cnblogs.com/android007/archive/2012/05/10/2494766.html 话说在工作中第一次接触android 的Handler 的时...
  • h3c4lenovo
  • h3c4lenovo
  • 2012年08月28日 10:10
  • 23769

Handler源码分析

Handler的作用Android消息机制我们都知道Android应用程序的UI的绘制都是在主线程(UI线程)进行的。如果在主线程做一些耗时操作会阻塞主线程的进行,耗时操作主要包括网络访问,大量计算,...
  • congwiny
  • congwiny
  • 2017年07月27日 11:24
  • 179

玩转Android Handler

Handler,一个我们平时再熟悉不过的名字。说到Handler,有时让我们开心,有时也让我们对它感到厌恶。这篇文章,我将和大家简单分享下Android 中Handler的使用以及对Handler的机...
  • u013718120
  • u013718120
  • 2016年05月16日 17:56
  • 1039

new Handler().obtainMessage().sendToTarget()过程分析

new Handler().obtainMessage().sendToTarget()这句话用着真爽,一行代码就能搞定异步消息了!所以在代码中使用的算是非常频繁的了,那这又是一个什么样的过程呢? 这...
  • qibin0506
  • qibin0506
  • 2015年03月30日 17:40
  • 4865

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

1. 前言 创建Message对象的时候,有三种方式,分别为:  1.Message msg = new Message();  2.Message msg2 = Message.obtai...
  • QPC908694753
  • QPC908694753
  • 2017年04月17日 19:34
  • 261

Handler机制流程梳理、源码分析

Handler机制流程梳理、源码分析 Handler机制的相关类 Looper与MessageQueue Message Handler...
  • wolinghuanyun
  • wolinghuanyun
  • 2016年09月20日 19:51
  • 138

Android Handler消息机制源码解析(下)

主要分析一下Handler,Message,MessageQueue,Looper的源码。
  • ljmkjth111
  • ljmkjth111
  • 2016年11月30日 16:01
  • 98

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

1. 前言创建Message对象的时候,有三种方式,分别为: 1.Message msg = new Message(); 2.Message msg2 = Message.obtain(); ...
  • dfskhgalshgkajghljgh
  • dfskhgalshgkajghljgh
  • 2016年09月26日 17:25
  • 4970

Handler基本使用(二)new Message 、 Handler.obtainMessage和Message.obtain

通常使用handler发送信息时,会使用下面两种方式       //方法1 Message msg = new Message(); msg.what = 1;...
  • u011791526
  • u011791526
  • 2016年12月09日 16:05
  • 1898
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Android自助餐】Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉
举报原因:
原因补充:

(最多只允许输入30个字)