App性能优化方案——布局层级太多怎么优化?

news2024/9/22 3:58:34

作者:小海编码日记

View整体布局是通过深度优先的方式来进行组织的,整体形似一颗树,所以优化布局层级主要通过三个方向来实施:

  • 降低布局深度:使用merge标签或者布局层级优化等手段来减少View树的深度;
  • 布局懒加载:使用ViewStub,AsyncLayoutInflater等布局加载手段,来确保只有当需要该布局时,该布局才会被创建,优化布局加载速度;
  • 布局重用:通过include等标签重用界面布局,减少GPU重复工作

解析:

<merge/>

<merge/>标签通常用于将其包裹的内容直接添加到父布局以达到降低布局深度的目的,一个普通的layout布局文件及其结构如下图所示:

当将该布局文件的根标签修改为<merge/>标签后,得到的布局结构如下图所示:

可以看出<merge/>标签内子元素的父布局均变更为顶上的FrameLayout,进而使得布局深度减1.

结合以上例子,我们可以得出 <merge/>标签的主要工作原理是将本应在<merge/>标签节点的Layout与该节点的父布局进行重用,以达到优化布局深度的目的,对<merge/>标签内包含的其他布局结构而言并不能起到优化深度的作用

使用<merge/>标签有以下注意事项:

  • 布局文件中<merge/>标签只能作为根标签;
  • 使用LayoutInflater加载<merge/>标签为根的布局文件时,必须设置attachToRoot为true,以确保重用父布局;
  • <merge/>标签携带的参数没有实际意义
  • <merge/>标签并不是真实存在的View或者ViewGroup,其相当于一种标记,用来表示其所包裹的内容应被添加到其上级布局,真实存在的ViewGroup是引用<merge/>标签布局的上一级布局

<ViewStub/>

<ViewStub/>标签通常用于声明布局中可以被延时加载的部分,在首次布局文件加载时处于占位状态,当调用inflate或者setVisible时才会完成加载动作,一个普通的使用<ViewStub/>布局文件及其结构如下图所示:

当执行ViewStub.inflate之后,得到的布局结构如下图所示:

可以看出ViewStub区域被其对应的布局结构替换掉了。

结合上述例子,我们可以得出使用<ViewStub/>标签可以管理在页面首次初始化时不需要加载的布局,提升渲染速度,等到需要这部分UI时再进行加载

<include/>

<include/>标签可以将一些公共布局文件在多处重复引用,以便提升布局效率,例如各个页面都有的状态栏,当使用自定义布局实现后,则可以使用<include/>标签进行重复引用。

<include/>标签使用示例代码如下:

 <?xml version="1.0" encoding="utf-8"?>
 <merge xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 ​
     <LinearLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content">
 ​
         <include
             android:id="@+id/view_stub"
             layout="@layout/test"/>
 ​
         <com.poseidon.looperobserver.customview.CustomView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center"
             android:id="@+id/custom_view"
             android:text="move me!" />
 ​
     </LinearLayout>
 ​
 </merge>

使用<include/>标签得到的布局结构如下图所示:

可以看出从布局结构来讲并无明显差异,在初次加载就会直接构建在View树上。


其实想要全面掌握好 Android 性能优化的话,这些知识点你必须要有所了解,如: 内存优化、网络优化、卡顿优化、存储优化……等,为了让大家一次都可以了解全,所以将其整合成名为《Android 性能优化核心知识点手册》,大家可以参考下:

《APP 性能调优进阶手册》:https://qr18.cn/FVlo89

启动优化

内存优化

UI优化

网络优化

Bitmap优化与图片压缩优化

多线程并发优化与数据传输效率优化

体积包优化

《Android 性能调优核心笔记汇总》:https://qr18.cn/FVlo89

《Android 性能监控框架》:https://qr18.cn/FVlo89

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/465462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第四十三天|1049. 最后一块石头的重量 II 、494. 目标和、474.一和零

文章目录 背包问题题型1049. 最后一块石头的重量 II494. 目标和474.一和零 背包问题题型 等和子集 —0-1背包能否装满最后一块石头—0-1背包尽量装满目标和—0-1背包装满&#xff0c;且有多少种装的方式&#xff08;组合问题&#xff09; 1049. 最后一块石头的重量 II 题目链…

网页爬虫之WebPack模块化解密(JS逆向)

WebPack打包: webpack是一个基于模块化的打包&#xff08;构建&#xff09;工具, 它把一切都视作模块。 概念&#xff1a; webpack是 JavaScript 应用程序的模块打包器,可以把开发中的所有资源&#xff08;图片、js文件、css文件等&#xff09;都看成模块&#xff0c;通过loade…

Java中Lambda表达式(面向初学者)

目录 一、Lambda表达式是什么&#xff1f;什么场景下使用Lambda&#xff1f; 1.Lambda 表达式是什么 2.函数式接口是什么 第二章、怎么用Lambda 1.必须有一个函数式接口 2.省略规则 3.Lambda经常用来和匿名内部类比较 第三章、具体使用场景举例&#xff08;&#xff09; …

水果店(库)管理系统 —— 实现了管理员模式与顾客模式 JAVA

水果店&#xff08;库&#xff09;管理系统 1.前言&#xff1a;2.功能简介及部分测试视频&#xff1a;3.本管理系统的构建原理&#xff08;简介)&#xff1a;(1).如何跳转页面&#xff1a;(2).如何让控制台能输出彩色字体&#xff1a;(3).如何稳定存储数据&#xff1a;(4).如何…

误操作清空了回收站文件如何找到文件

我们在删除文件的时候&#xff0c;文件都是先跑到回收站里的&#xff0c;这样的防止我们出现误删的情况&#xff0c;但往往也会出现我们要恢复删除的文件却误操作清空了回收站的情况&#xff0c;那么误操作清空了回收站如何找到呢&#xff0c;下面小编给大家分享误操作清空了回…

window 10 安装node.js时遇到2502 2503错误(已解决)

node安装失败2503的解决办法&#xff1a;1、在WIN搜索框搜索powershell并右击&#xff1b;2、点击使用管理员身份运行powershell命令行工具&#xff1b;3、输入“msiexec /package node”&#xff1b;4、打开安装包&#xff0c;根据提示安装即可。 本文操作环境&#xff1a;Win…

9.Join的应用

1.reduceJoin的应用 案例&#xff1a;将两个表合并成一个新的表 需求分析&#xff1a;通过将关联条件作为Map输出的key&#xff08;此处指pid&#xff09;&#xff0c;将两表满足Join条件的数据并携带数据所来源的文件信息&#xff0c;发往同一个ReduceTask&#xff0c;在Redu…

汇编小程序解析--3D立方体旋转

汇编小程序解析–3D立方体旋转&#xff0c;源代码如下&#xff0c;是vulture大神于1995年写的&#xff0c;我到现在才基本看懂。 ;本程序由国外的Vulture大哥编写&#xff0c;并公布了源码&#xff0c;这个是他95年的一个作品&#xff0c;可以说是在当时是非常成功的&#xff…

论shell之条件语句-if语句、case语句

目录 一&#xff1a;条件测试 1.文件测试 2.常见的测试操作符 3.整数值比较 ​4.字符串比较 ​5. 逻辑测试 二&#xff1a;if语句 1.单分支结构 2.单分支结构实例 3.双分支结构 4.双分支结构实例 5.多分支结构 6.多分支机构实例 7.嵌套if语句实例 三&#xff1a;case语…

2023企业服务的关键词:做强平台底座

作者 | 曾响铃 文 | 响铃说 4月下旬&#xff0c;软件行业相关的大会紧锣密鼓地开了好几场&#xff0c;不仅有政府主办的2023中国国际软件发展大会、中国软件创新发展大会&#xff0c;也有用友、浪潮等服务商举办的品牌活动&#xff0c;让软件业的话题一直保持热度。 以用友为…

十大排序算法简单总结与对比

假设排序均从小到大排序 排序算法工作原理平均时间复杂度最坏时间复杂度空间复杂度是否稳定排序冒泡排序把相邻元素两两比较&#xff0c;若左侧的元素大于右侧的元素&#xff0c;则交换&#xff0c;否则不交换。&#xff08;每一轮最大的会跑到最右边&#xff09;O(&#xff0…

VGA协议实践

文章目录 前言一、VGA接口定义与传输原理1、VGA接口定义2、传输原理3、不同分辨率对应不同参数 二、Verilog编程1、VGA显示彩色条纹2、VGA显示字符3、输出一幅彩色图像4、Quartus操作1、添加PLL核2、添加ROM核 三、全部代码四、总结五、参考资料 前言 VGA的全称是Video Graphi…

VBA最基础的趣味速成练习--VBA资料

很多朋友想学VBA&#xff0c;但是苦于无处入手&#xff0c;我特意花了几天时间&#xff0c;做了一个VBA速成练习表格 能让你快速上手VBA&#xff0c;感受到VBA的神奇之处&#xff0c;相信我们日常使用表格的朋友会非常喜欢它的&#xff0c; 下面是我们的表格界面&#xff0c;…

选择营销自动化软件时的3个常见错误

做出投资营销自动化软件的决定是一个重大决定&#xff0c;可能很难知道从哪里开始&#xff0c;尤其是当市场上有这么多选择时。选择正确的自动化软件可能是拥有良好的营销运营与拥有低效营销团队之间的区别。在这篇博文中&#xff0c;我们将讨论人们在选择营销自动化软件时最常…

Flink之TaskManager内存解析

一、CK失败 Flink任务的checkpoint操作失败大致分为两种情况&#xff0c;ck decline和ck expire: &#xff08;1&#xff09;ck decline 发生ck decline情况时&#xff0c;我们可以通过查看JobManager.log或TaskManager.log查明具体原因。其中有一种特殊情况为ck cancel&…

排序 - 选择排序(Selection sort)

文章目录 选择排序介绍选择排序实现选择排序的时间复杂度和稳定性选择排序时间复杂度选择排序稳定性 代码实现核心&总结 每日一道算法&#xff0c;提高脑力。第四天&#xff0c;选择排序。 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素&#…

Shiro详解(超全面)

目录: 一、简介二、Shiro的整体架构1、Subject2、Security Manager3、Cryptography4、Authenticator5、Authorizer6、realm7、sessionManager8、SessionDAO9、CacheManager 三、入门案例四、认证流程1、认证流程2、常见异常 五、授权流程1、授权流程2、自定义realm实现授权 六、…

JavaScript日期库之date-fn.js

用官网的话来说&#xff0c;date-fn.js 就是一个现代 JavaScript 日期实用程序库&#xff0c;date-fns 为在浏览器和 Node.js 中操作 JavaScript 日期提供了最全面、但最简单和一致的工具集。那实际用起来像它说的那么神奇呢&#xff0c;下面就一起来看看吧。 安装 安装的话就…

深度学习 -- pytorch 计算图与动态图机制 autograd与逻辑回归模型

前言 pytorch中的动态图机制是pytorch这门框架的优势所在&#xff0c;阅读本篇博客可以使我们对动态图机制以及静态图机制有更直观的理解&#xff0c;同时在博客的后半部分有关于逻辑回归的知识点&#xff0c;并且使用pytorch中张量以及张量的自动求导进行构建逻辑回归模型。 …

Springboot 自动装配流程分析

目录 1.基础知识&#xff1a; 2.具体代码执行流程 3.流程总结&#xff1a; 4.参考文章&#xff1a; 1.基础知识&#xff1a; springboot的自动装配是利用了spring IOC容器创建过程中的增强功能&#xff0c;即BeanFactoryPostProcessor&#xff0c; 其中的ConfigurationCla…