Android性能优化实践---我是如何把构建布局耗时缩短-20-倍的(上)

2023-11-16

ensureOpenLocked();
//‘打开 xml 布局文件’
final long xmlBlock = nativeOpenXmlAsset(mObject, cookie, fileName);

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

if (xmlBlock == 0) {
//‘若打开失败则抛文件未找到异常’
throw new FileNotFoundException(“Asset XML file: ” + fileName);
}
final XmlBlock block = new XmlBlock(this, xmlBlock);
incRefsLocked(block.hashCode());
return block;
}
}
}

通过一个 native 方法,将布局文件读取到内存。走查到这里,有一件事可以确定,即 “解析 xml 布局文件前需要进行 IO 操作,将其读取至内存中”

解析布局文件

读原码就好像“递归”,刚才通过不断地“递”,现在通过“归”回到那个关键方法:

public abstract class LayoutInflater {
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {
final Resources res = getContext().getResources();

//‘获取布局文件解析器’
final XmlResourceParser parser = res.getLayout(resource);
try {
//‘填充布局’
return inflate(parser, root, attachToRoot);
} finally {
parser.close();
}
}
}

通过 IO 操作将布局文件读到内存后,调用了inflate()

public abstract class LayoutInflater {
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
synchronized (mConstructorArgs) {

try {
//‘根据布局文件的声明控件的标签构建 View’
final View temp = createViewFromTag(root, name, inflaterContext, attrs);

ViewGroup.LayoutParams params = null;

//‘构建 View 对应的布局参数’
if (root != null) {
// Create layout params that match root, if supplied
params = root.generateLayoutParams(attrs);
if (!attachToRoot) {
// Set the layout params for temp if we are not
// attaching. (If we are, we use addView, below)
temp.setLayoutParams(params);
}
}


//‘将 View 填充到 View 树’
if (root != null && attachToRoot) {
root.addView(temp, params);
}

} catch (XmlPullParserException e) {

} finally {

}
return result;
}
}

这个方法解析布局文件并根据其中声明控件的标签构建 View实例,然后将其填充到 View 树中。解析布局文件的细节在createViewFromTag()中:

public abstract class LayoutInflater {
View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,boolean igno

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

Android性能优化实践---我是如何把构建布局耗时缩短-20-倍的(上) 的相关文章

随机推荐

  • 【满分】【华为OD机试真题2023 JS】优秀学员统计

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 优秀学员统计 知识点排序统计编程基础 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 公司某部门软件教导团正在组织新员工每日打卡学习活动 他们开展这项学习活动已经
  • 说说React中setState执行机制?

    setState是异步的 1 调用setState是不会立即更新的 2 所有组件使用的是同一套更新机制 当所有组件didmount之后 父组件didmount 然后统一执行更新 3 更新时会把每个组件的更新合并 每个组件只会触发一次更新后的
  • 合肥工业大学 软件学院 软件质量保证与测试 第九章 软件测试

    文章目录 第九章 软件测试 1 软件测试概述 1 1 软件测试的定义 1 2 软件测试的目的 2 软件测试过程 3 软件测试类型 3 1 单元测试 3 2 集成测试 测试方法 3 3 系统测试 3 4 验收测试 3 5 回归测试 3 6 补
  • 高通功耗调试16之连接BT待机功耗大问题分析(Android P)

    问题背景 Android P上Google修改了BT的代码 在待机时允许modem上报网络信号强度给AP 因此连接BT待 机时AP会被频繁唤醒 导致待机功耗增加 问题解决 问题分析请参考KBA 190212004248 适用平台 ALL A
  • iOS安全攻防—目录

    The most difficult thing to do in a strange city is not to forget why you started the trip 在光怪陆离的城市拼尽全力 最难的是勿忘初心 一 工具篇 C
  • 响应式网页设计初探

    我首次接触响应式网页设计还要从应用bootstrap说起 我们运用bootstrap的网格类简单的将响应式设计带入我们的网页设计当中 当然bootstrap框架其实还做了其他事情以支持网页响应式设计 现在 就让我们一窥响应式网页设计背后的原
  • 【工具使用】Spyder代码补全问题

    我的Spyder突然不能够进行自动补全了 试了以下几种方法 1 如下图操作 但是没有任何用 2 在anaconda控制台输入pip list 查看安装了哪些包 如果存在enum34 则删除 pip uninstall enum34 重启sp
  • 利用偏函数设计学习率下降方式

    Python partial 首先 我们需要简单了解下偏函数的作用 和装饰器一样 它可以扩展函数的功能 但又不完成等价于装饰器 通常应用的场景是当我们要频繁调用某个函数时 其中某些参数是已知的固定值 通常我们可以调用这个函数多次 但这样看上
  • IP代理

    IP作为互联网的重要的桥梁 是计算机网络相互连接进行通信而设计的协议 正是因为有了P协议 因特网才得以迅速发展成为庞大的 开放的计算机通信网络 IP代理中常常可以看到IPv4与IPv6 今天就给各位跨境老板详细解释 他们是什么 如何选择 一
  • 计算机大四找不到工作怎么办?应届生如何找到合适的工作?

    计算机大四找不到工作怎么办呢 金三银四的到来 很多大四计算机专业学生最近很是焦虑 自己在校成绩不够突出 技术实力也是平平 投递了很多企业迟迟得不到反馈 眼看着毕业季越来越靠近 身边同学都已获得大厂offer 而自己手上一个offer都没有
  • Mac电脑M1芯片Python环境搭建

    一 安装miniforge 1 从github中下载miniforge 也可以在我的阿里云盘中下载miniforge 提取密码为 R6pb 2 打开终端 找到下载的文件的位置 进行安装 进入下载位置 cd XXX Downloads lis
  • flutter 打包安装后闪退问题

    问题 升级flutter插件后 生成release版apk 安装到手机启动flutter代码时出现闪退问题 log日志回报一系列的so库错误 原因 具体原因我不知道到什么原理造成 个人理解的应该是flutter sdk 版本问题 解决 在a
  • Linux查看文件大小的命令du的简单介绍

    文章目录 官方介绍 简单介绍 常用选项 与单位相关的选项 apparent size B block size SIZE b bytes k m 与遍历深度相关的选项 s summarize d max depth N h human re
  • 时间序列突变点检测

    我对时间序列异常点算法小结 基于时间序列的异常检测算法小结 Jasminexjf的博客 CSDN博客 基于时间序列的异常检测算法 当前异常检测类型 最重要的异常类型 例如意外的峰值 下降 趋势变化和水平转移 我主要研究的是负荷预测的突变点
  • mysql8的卸载

    mysql8的卸载 卸载mysql8 卸载mysql8 先在Windows界面使用快捷键Windows R搜索services msc进入服务 找到mysql并停止它 然后进入C盘将隐藏文件显示出来 进入装有mysql文件夹的三个文件并删除
  • 软件测试基础与基于生命周期的软件测试

    软件测试基础 2 1软件测试 2 1 1定义 在规定的条件下对程序进行操作 以发现程序是否满足设计错误 衡量软件质量并对其是否满足设计要求进行评估的过程 2 1 2目的 发现缺陷 提高质量 验证是否满足需求 建立软件质量的信心 2 1 3原
  • centos安装、docker配置、容器运行

    Linux下安装docker的使用 一 课程目标 1 docker是什么 2 docker的架构 名词解析 3 都看恻然对测试人员的意义 4 docker安装 5 镜像命令 6 容器命令 7 DockerFile介绍 8 部署项目实战 To
  • 在A100上使用TensorFlow1.15,提供安装nvidia-tensorflow[horovod] 需要的nvidia包的whl

    安装nvidia pyindex 和nvidia tensorflow horovod 需要的nvidia包的whl 已经传到百度网盘 nvidia tensorflow 1 15 5 nv22 04 CUDA12 在A100的显卡上运行T
  • pandas的导入导出

    Pandas 导入导出 pandas可以读取与存取的资料格式有很多种 像csv excel json html与pickle等 http pandas pydata org pandas docs stable io html import
  • Android性能优化实践---我是如何把构建布局耗时缩短-20-倍的(上)

    ensureOpenLocked 打开 xml 布局文件 final long xmlBlock nativeOpenXmlAsset mObject cookie fileName Android学习笔记总结 最新移动架构视频 大厂安卓面