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

2023-05-16

【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;就变成下图
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()方法来取出和放入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 这个方法比 Math.random() 更快吗?

    我是一名初学者 目前已经开始开发一款使用粒子群优化算法的 Android 游戏 我现在正在尝试稍微优化我的代码 并且 for 循环中有相当多的 Math random 几乎一直在运行 所以我正在考虑一种方法来绕过并跳过所有 Math ran
  • Gradle 构建错误:内存不足

    当我使用 gradle 构建时 它失败并显示以下信息 OpenJDK 64 Bit Server VM warning INFO os commit memory 0x0000000788800000 89128960 0 failed e
  • 我在哪里可以获得可靠的熵来源(真正的随机性字节[])?

    目前 我正在寻找一种方法来增加随机性的质量 in my Android应用程序 纸牌游戏 之前 估计对于我的情况 52 排列 至少需要 226 位熵 226 个随机位 我打算用这个byte 作为种子SecureRandom SecureRa
  • 如何在 ADB 连接期间禁用电池充电?

    问题描述 每次我在电脑和手机之间连接 USB 线时 电池都会自动充电 我想使用 ADB 协议 但我不想在 ADB 连接期间为电池充电 是否可以关闭此充电功能 当然 我该怎么做呢 环境 Android 操作系统 4 及更高版本的手机 我只需要
  • 从历史堆栈中删除活动

    我的应用程序在用户第一次运行应用程序时显示注册活动 如下所示 活动启动画面 欢迎来到游戏 注册帐户 ActivitySplashScreenSignUp 很好 填写此信息 ActivityGameMain 游戏主屏幕 因此 当用户单击每个屏
  • 如何在android中压缩和解压png图像

    您好 在我的应用程序中 当我单击 zip 按钮时 我需要压缩图像文件 当我单击解压缩按钮时 我需要解压缩文件 我尝试使用下面的代码来压缩图像 但我的问题是当我单击 zip 按钮时 正在创建 zip 文件 但之后在使用 winzip 软件的系
  • 如何在 android 中启动“添加联系人”活动

    您能告诉我如何在 Android 中启动 添加联系人 活动吗 谢谢 API 级别 5 及以上解决方案 Add listener so your activity gets called back upon completion of act
  • 如何访问android库项目中的资源

    我正在构建一个 android 库项目 它内部需要一些静态资源 图像 xml 等 然后我想知道我可以把这些资源放在哪里以及如何访问它们 既然我把资源放到了assets文件夹 我使用 AssetManager 来访问资源 public cla
  • Android PhoneGap 插件,UI 选项卡栏,调整 WebView 大小

    我正在创建一个美味的 PhoneGap 插件 希望一旦它能被打开 准备好了 插件基本完成了 我只需要一个漂亮的用户界面 相互作用 简而言之 我想创建一个 本机 android 工具栏组件 如果您实现 PhoneGap UIControls
  • Android:如何使用后台线程?

    我开发了一个应用程序 它从互联网获取内容并相应地在设备的屏幕上显示它 该程序运行得很好 就是有点慢 加载并显示内容大约需要 3 4 秒 我想将获取内容并将其显示在后台线程中的所有代码放在一起 当程序执行这些功能时 我想显示一个进度对话框 你
  • Google 地图删除标记路线上下文菜单

    我使用 Android Studio 的 Google 地图模板启动了一个新项目 并在地图上添加了一个标记 LatLng location new LatLng lat lng Marker marker mMap addMarker ne
  • 在 Android Lollipop 中从 Uri 中裁剪照片后总是返回 Null?

    我尝试在拍照或挑选照片后从 Uri 中裁剪图像 我的代码是这样的 public static void cropImage Uri uri Activity activity int action code Intent intent ne
  • Android:使 Dialog 周围的所有内容都比默认值更暗

    我有一个具有以下样式的自定义对话框 它显示了一个无边框对话框 后面的任何内容都会 稍微 变暗 我的设计师希望背后的一切都比 Android 的默认设置更暗 但不是完全黑色 有这样的设置吗 我能想到的唯一解决方法是使用全屏活动而不是对话框 只
  • 如何制作在手机和平​​板电脑上使用的响应式Android应用程序?

    我创建了一个 Android 应用程序 当我运行我的应用程序时Mobile Phone它工作得很好 但是当我跑进去时Tablet应用程序的布局已更改 那么 如何制作响应式Android应用程序用于Mobile并且也在Tablet 在Andr
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 屏幕开/关检测

    在这里 我试图确定屏幕是否打开 但按下电源锁定 解锁按钮时它似乎不起作用 应用程序运行没有错误 但 if else 中的代码似乎没有效果 Edited现在代码可以工作了 谢谢Olgun 但媒体播放器播放不会停止 并且每次在屏幕上 离屏时都会
  • Activity 类型中的方法 showDialog(int) 在 Android 中已被弃用?

    方法showDialog int 从类型Activity is 已弃用 什么原因 以及如何解决 什么原因 http developer android com reference android app Activity html show
  • Android 地理围栏无法正常工作(未调用 IntentService)

    这是我的代码 安卓清单
  • R.java是手动修改的!恢复到生成的版本

    我在布局中添加了一个 xml 文件 之后这个错误就来了 但问题是我还没有接触过 R java 文件 现在 在我的新活动中 我要将其内容视图设置为我新创建的 xml 文件 但是当我执行 R layout 时 新创建的 xml 不会出现在建议中
  • 我应该如何在 Android 上使用 Retrofit 处理“无互联网连接”

    我想处理没有互联网连接的情况 通常我会运行 ConnectivityManager cm ConnectivityManager context getSystemService Context CONNECTIVITY SERVICE N

随机推荐

  • 【Week14作业 D】Q老师染砖【矩阵快速幂优化dp】

    题意 xff1a 衣食无忧的 Q老师 有一天突发奇想 xff0c 想要去感受一下劳动人民的艰苦生活 具体工作是这样的 xff0c 有 N 块砖排成一排染色 xff0c 每一块砖需要涂上红 蓝 绿 黄这 4 种颜色中的其中 1 种 且当这 N
  • 【Week15实验 D】瑞瑞爱上字符串【模拟】

    题意 xff1a 瑞瑞最近迷上了字符串 xff0c 因此决定出一个字符串的题 给定两个正整数 N K xff0c 考虑所有由 N 2 个 a 和 2 个 b 组成的字符串 xff0c 要求输出其中字典序第 K 小的 例如当 N 61 5 时
  • 【Week15作业 C】ZJM与纸条【KMP】

    题意 xff1a ZJM 的女朋友是一个书法家 xff0c 喜欢写一些好看的英文书法 有一天 ZJM 拿到了她写的纸条 xff0c 纸条上的字暗示了 ZJM 的女朋友 想给 ZJM 送生日礼物 ZJM 想知道自己收到的礼物是不是就是她送的
  • 【Week16实验 A】TT数鸭子【模拟】

    题意 xff1a 思路 xff1a 如果k gt 10 xff0c 则每个数都可以满足条件 xff0c 答案即为n xff1b 否则依次读入每一个数 xff0c 计算不同数位的个数sum xff0c 如果sum lt k xff0c 则这个
  • 【Week16实验 B】ZJM要抵御宇宙射线【模拟】

    题意 xff1a 思路 xff1a 对每个点都求出到其余点的距离平方 xff0c 然后取该点到其他点的距离平方的最大值为半径平方 xff0c 最后对所有点的半径平方取最小值 注意有多解时将x较小 y较小的点作为答案 总结 xff1a 一道简
  • 【Week16实验 C】宇宙狗的危机【区间dp】

    题意 xff1a 思路 xff1a 这道题是区间dp xff0c 不是BST xff01 xff01 xff01 令l i j 表示以j为根 j的左子树可到i这样的BST是否存在 xff0c r i j 表示以i为根 i的右子树可到j这样的
  • Ubuntu实现远程登陆之telnet——安装telnet服务端

    telnet是一种网络通信协议 xff0c 我们可以使用它登录远程服务器 xff0c 虽然telnet有安全问题这一硬伤 xff0c 但正因如此 xff0c 它十分简洁 xff0c 非常容易地在资源受限设备上 xff08 如嵌入式环境 xf
  • week6 限时大模拟 A - 掌握魔法の东东 II

    题意 思路 创建一个pair lt int int gt 类型的数组a xff0c 用来保存一副牌的花色以及大小 运用stl的vector xff0c 来存储手牌shoupai xff0c 随后使用dfs搜索 xff0c 数组a里的牌在手牌
  • Hadoop可视化神器-Hue安装、编译、运行

    下载安装 CDH版本 xff1a http archive cloudera com cdh5 官网 xff1a http gethue com tar zxf hue 3 9 0 cdh5 15 0 tar gz C opt module
  • 电脑通过wifi连接树莓派3

    前提要求 树莓派首先要能用网线和电脑连接起来 树莓派和电脑连接的是同一个wifi 电脑的网络设置和电脑网线直连树莓派的设置是一样的 xff0c 可以参照我的上篇博文设置 树莓派必须是树莓派3型 xff0c 因为只有这个型号才内置了wifi模
  • Ubuntu更换源说明

    Ubuntu更换源说明 更换源步骤如下 xff1a 备份源列表 sudo cp etc apt sources list etc apt sources list bak 命令行打开sources list文件 sudo gedit etc
  • MyBatis-Plus 分页查询以及自定义sql分页

    一 引言 分页查询每个人程序猿几乎都使用过 xff0c 但是有部分同学不懂什么是物理分页和逻辑分页 物理分页 xff1a 相当于执行了limit分页语句 xff0c 返回部分数据 物理分页只返回部分数据占用内存小 xff0c 能够获取数据库
  • golang为什么用协程而不是线程

    当协程阻塞的时候 xff0c 运行时会自动将同一操作系统线程上的其他协程移动到另一个可运行的线程上 xff0c 这样这些协程就不会阻塞 xff0c 并且这个操作对开发人员来说是透明的 调用协程的开销很小 xff0c 大概只在内存的栈区用几K
  • golang从channel读数据的各种情况

    文章目录 用var定义channel且不make用var定义channel且make直给写操作加for直给读操作加for读写都加for读channel的第二个返回值关闭channel继续读写完然后关闭channel再开始读加个selectc
  • 一个小技巧:修改swagger源码让postman更好用

    本文假设你知道swagger xff0c 并且会用go generate swagger generate spec o swagger json生成json 首先生成的swagger json是可以直接导入到postman的 xff0c
  • rancher导入集群时证书报错

    rancher导入集群时证书报错 现象 导入集群时 xff0c cattle cluster agent报错如下 xff1a time 61 34 2022 06 28T08 00 28Z 34 level 61 error msg 61
  • goland远程调试k8s上容器

    goland远程调试k8s上容器 上次也遇到过一次需要在k8s的容器里debug程序的情况 xff0c 当时找了个偷懒的办法绕过去了 xff0c 这回绕不过去了 xff0c 老老实实整一把 主要还是用dlv配合goland的远程调试功能 选
  • 星际争霸2免修改器修改绝对一劳永逸

    那年那个冬天 xff0c 那是的我还是个那么纯洁的同学 长话短说 xff0c 就那个寒假百无聊赖的玩了玩星际争霸2单机模式 xff0c 然后各种被虐 劳资表示不服 xff0c 于是开启上帝模式打开游戏安装目录 随后将各种模式下的cpu玩家海
  • kali 简单版攻击WiFi(附详细教程)

    首先检查是否有无限网卡 在root终端输入ifconfig xff0c 检查是否有wlan0 然后分为以下几个步骤 xff08 review专用 xff0c 没有基础就看下面详细教程 xff09 1 输入airmon ng start wl
  • 【Android自助餐】Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉

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