Message中obtain()与recycle()

原文:链接

在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 flagsPoolSize--;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;就变成下图

继续sPool = m.next;

然后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;

执行sPool=this;

现在可以很清楚的看到,Message类本身就组织了一个栈结构的缓冲池。并使用obtain()方法和recycler()方法来取出和放入。

obtain()的重载方法的区别:文章链接

Message中obtain()与recycle()相关推荐

  1. golang proto3的message中奇怪字段XXX_NoUnkeyedLiteral

    Protocol Buffers中,通过syntax设置语法类型,有proto2和proto3两种语法.当使用proto3时,会自动生成奇怪的字段,如XXX_NoUnkeyedLiteral.XXX_ ...

  2. 安卓技术文章集合—184篇文章分类汇总

    View篇: UI特效之酷炫抢红包金币下落动画 http://mp.weixin.qq.com/s?__biz=MzI3OTU0MzI4MQ==&mid=2247484357&idx= ...

  3. 2017上半年技术文章集合—184篇文章分类汇总

    声明 | 作者 :于亚豪 | 原创 | 终端研发部 前言: 2017年已经过大半,公众号里技术文章整理和归类了一下,方便给大家查找和阅读.这也是目前 发文的一个统计. View篇: 高级UI特效之酷炫 ...

  4. Android 面试准备进行曲 (Handler源码/面试题)v1.3

    前言 Handler 流程 流程源码 Handler 初始化 Looper 初始化 Handler 发送消息 Looper.loop -> MessageQueue.next Handler 消 ...

  5. 2017上半年技术文章集合【Android】—184篇文章分类汇总

    地址: mp.weixin.qq.com/ 声明 | 本文是于亚豪 原创 终端研发部 前言: 2017年已经过大半,公众号里技术文章整理和归类了一下,方便给大家查找和阅读.这也是目前 发文的一个统计. ...

  6. 安卓 Handler 消息机制之MessageQueue源码

    首先,MessageQueue是属于底层类且它依附于创建他的Looper,除Looper外其他类无法单独创建他,如果要使用他,只能从Looper出获得. 下面将从几方面分析: 1. 消息队列存储原理 ...

  7. 详细讲解Android中的Message的源码

    相信大家对于Android中的Handler是在为熟悉不过了,但是要知道,Handler就其本身而言只是一个壳子,真正在内部起到作用的是Message这个类,对于Message这个类,相信大家也不会陌 ...

  8. 关于在用异步消息处理机制使用Message.Obtain()方法(而非New Message)获得一个Message对象的好处

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

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

    通常使用handler发送信息时,会使用下面两种方式 //方法1Message msg = new Message();msg.what = 1;msg.arg1 = 2;msg.arg2 = 3;m ...

最新文章

  1. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )
  2. android 情景感知 sdk,情景感知服务
  3. 用神经网络做分子动力模拟 二氟甲烷,二氯甲烷,二溴甲烷并计算键值
  4. leetcode24. 两两交换链表中的节点(思路+解析)
  5. 今晚8点直播(内含福利)丨 Oracle RAC集群安装部署
  6. 游戏安全报告(2017 - 2018全年)
  7. [转载]——Axure+SVN配置
  8. vantabs多页渲染_选择引擎渲染页面
  9. 禁用 device/credential guard_iOS 13.3.1 Beta版中引入了禁用U1超宽带芯片的开关
  10. 机器人末端执行器气爪怎么吸合_工业机器人带动末端执行器市场发展
  11. 用PASS软件完成多组率的样本量计算
  12. scara机器人动荷载_揭密SCARA机器人
  13. css 背景图片虚化效果
  14. 华为发布八核处理器Kirin 920
  15. cf 467 B. Sleepy Game
  16. 送你一套免费英语资料(价值1899)
  17. 什么叫克隆人_什么是克隆技术?
  18. Sharding-JDBC + SpringBoot
  19. 联想笔记本电脑静音键常亮且电脑没有声音
  20. Java设计模式(5):工厂模式

热门文章

  1. TlBCO Jaspersoft Studio 软件根据条件设置字体颜色
  2. 上面两点下面一个三角形_章勤琼:三角形内角和180该如何说明 ——小学数学中的合情推理和演绎推理...
  3. KaLi Linux 安装sougou输入法
  4. Python绘制正弦、余弦函数图像
  5. UVA11021 Tribles 概率
  6. 如何在Android Studio中设置*md文件打开方式
  7. CD系列芯片功能大全
  8. html右下角区块,HTML 区块
  9. PAT 1110 区块反转 (25 分) c语言
  10. 推广有哪些渠道?用好这4个引流渠道日引200