大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢

转载请标明出处(http://blog.csdn.net/kifile),再次感谢

原文地址:http://developer.android.com/training/improving-layouts/optimizing-layout.html

在接下来的一段时间里。我会每天翻译一部分关于性能提升的Android官方文档给大家

性能优化之布局篇:

[Android
性能优化系列]布局篇之通过<include>复用布局

题外话:

复杂的布局,既会提高我们的设计难度,也会减少我们的代码效率,因此,不放多使用一下相对布局什么的。

以下是本次的正文:

################

大家写布局文件的时候都会觉得仅仅要使用基本布局可以到达高效的结果。事实上这是错的。你要知道你加入到你应用中的每个控件和布局文件都须要经过初始化。排列位置和绘制三个过程。比方说,使用嵌套的线性布局可能导致你的布局层级变得十分冗余。

此外,假设在嵌套的线性布局中使用了 layout_weight 參数的话。那么他的每个子 view 都须要被又一次測量两次。

特别是当他们被用在 ListView
和 GridView 中时,他们会被重复的測量。

在本文中,你将学习到怎样使用 Hierarchy Viewer 以及 Layoutopt 来检測和优化你的布局。

检查你的布局

在 Android SDK 里有一个叫做 HierarchyViewer 的工具,它可以帮助你在应用正在执行的时候分析你的布局。使用这个工具,可以帮助你发现布局性能方面的瓶颈。

HierarchyViewer 可以让你从当前连接到电脑上的设备或者模拟器上选择一个进程,然后展示他的布局树。

而且他可以将每一个控件在measure,layout 和 draw 的时候所花费的时间都显示出来。从而帮助你发现问题

举例说。图1展示了一个用作 ListView item 的布局。这个布局的左側是一张图片,右側是两层文本。你应该清楚在 ListView 中这个布局将被多次初始化

Hierarchyviewer工具存放的位置在<sdk>/tools 下。当它被打开以后,在 HierarchyViewer 会显示一个当前设备列表,以及全部正在执行的组件。点击Load View Hierarchy 能够查看选中组件的布局层级。比方说,图2就显示了图1中所说的布局

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2lmaWxl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

在图2中,你可以看见这里有三层布局,点击每个元素。会和图3一样显示他显示到界面过程中每一步所消耗的时间。这使得我们可以清楚的了解在測量,布局以及渲染阶段你所花费的时间,你也会清楚,你应该从哪儿下手去优化他。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2lmaWxl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

上图中显示的时间是,測量0.977ms ,布局 0.167ms,绘制2.717ms

修正你的布局

从上面的布局信息中。我们能够发现,嵌套的线性布局减少了我们的布局效率。因此我们能够通过将布局扁平化来提升性能。

一个线性布局也能够制作成类似于上面的布局,因此,我们能够将布局转变为使用线性布局,这样一来布局就变成两层了。检查布局之后会发现他是这样子的

如今渲染一个 item 所花费的时间为 測量0.598ms,布局0.110ms,绘制2.146ms

也许看起来这个没有多大提升,可是你要知道这个 Item会在 listView 中被多次使用,重复绘制.

事实上大多数绘制时间差异是由于我们在线性布局中使用了 layout_weight,他会减少对布局的測量速度,当然这仅仅是你应该慎重使用布局权重的原因之中的一个。

使用 Lint

通常你能够在你的布局文件里通过使用 Lint 来查找可能的布局优化。Lint 如今已经取代了 Layoutopt。并且更有效率,以下是 Lint 的一些规则

1.尽量使用复合图片,一个线性布局中假设包括一个 ImageView 和一个 TextView。那么你能够使用复合图片来替换

2.去掉不须要的根节点,假设一个 FrameLayout 是整个布局的根节点,而且他没有提供背景,留白之类的东西。那么我们能够使用 merge 标签来让他变得更有效

3.降低布局中的枝叶。假设一个布局没有子 View 或者背景,那么他能够被移除掉(况且他本身就是不可见的)来让布局更有效

4.降低父母层级,假设一个布局没有兄弟,而且他不是 ScrollView 或者根 View,而且也没有背景,那么他就能够直接被移除掉,他的孩子能够直接被移到他父母的层级下

5.避免过深的布局层级,多次嵌套的布局文件不利于性能。

你能够考虑通过相对布局或者网格布局来提升性能,默认的最深布局深度是10。

Lint 工具眼下已经被合并到了 Android 开发工具里了,他可以在你对项目代码做出更改之后自己主动执行。你可以通过 Eclipse 工具栏上的button来开闭他

当使用 Eclipse 的时候。Lint 能够自己主动修复一些问题,并提供一些建议,你还能够直接通过点击代码跳转到相应的布局文件里。

假设你没有使用 Eclipse 作为开发环境,那你也能够通过命令行使用Lint ,很多其它的帮助信息。你能够參看tools.android.com

[Android 性能优化系列]降低你的界面布局层次结构的一部分的更多相关文章

  1. Android性能优化系列之App启动优化

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 Android性能优化系列之apk瘦身 应用的启动速度缓慢是我们在开发过程中常常会遇到的问题,比方启动缓慢导致的黑屏.白屏问 ...

  2. [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  3. Android性能优化系列之apk瘦身

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中.他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...

  4. [Android 性能优化系列]内存之基础篇--Android怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  5. Android性能优化系列之电量优化

    电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情,随着Android开的性能要求越来越高,电量的优化,也显得格外重要,一个耗电的应用,用户肯定会毫不犹豫的进行卸载,所 ...

  6. Android性能优化系列 + Android官方培训课程中文版

    Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/   Android性能优化典范 - 第5季 htt ...

  7. Android性能优化系列总篇

    目前性能优化专题已完成以下部分: 性能优化总纲——性能问题及性能调优方式 性能优化第四篇——移动网络优化 性能优化第三篇——Java(Android)代码优化 性能优化第二篇——布局优化 性能优化第一 ...

  8. Android性能优化系列---管理你的app内存

     文章出处:http://developer.android.com/training/articles/memory.html#YourApp Random-access memory(RAM)在任 ...

  9. Android性能优化系列之Bitmap图片优化

    https://blog.csdn.net/u012124438/article/details/66087785 在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitma ...

随机推荐

  1. 二十9天 月出冲击黑鸟 —Spring的AOP_AspectJ @annotation

    6月14日,阴转雨. "四面垂杨十里荷,向云何处最花多, 画楼南畔夕阳和.天气乍凉人寂寞, 光阴须得酒消磨,且来花里听笙歌." 面向切面的框架AspectJ邂逅Spring,不仅造 ...

  2. HDoj-1879-畅通project-并查集

    继续畅通project Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质

    原文:Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质 Linux内核分析(六) 昨天我们对字符设备进行了初步的了解,并且实现了简单的字符设备驱动,今天我们继续对字符设备的某些方 ...

  4. (大数据工程师学习路径)第二步 Vim编辑器----高级功能入门

    一.多文件编辑 1.使用vim编辑多个文件 编辑多个文件有两种形式,一种是在进入vim前使用的参数就是多个文件.另一种就是进入vim后再编辑其他的文件. 同时创建两个新文件并编辑 $ vim 1.tx ...

  5. Redis源代码分析(十)--- testhelp.h小测试框架和redis-check-aof.c 日志检测

    周期分析struct结构体redis代码.最后,越多越发现很多的代码其实大同小异.于struct有袋1,2不分析文件,关于set集合的一些东西,就放在下次分析好了,在选择下个分析的对象时,我考虑了一下 ...

  6. Python标准库:内置函数format(value[, format_spec])

    的值的函数value按format_spec的格式来格式化,然而函数解释format_spec是依据value的类型来决定的.不同的类型有不同的格式化解释. 当參数format_spec为空时,本函数 ...

  7. C# LDAP 管理(创建新用户)

    今天用C#实现了一套LDAP域账号的创建和查询,感受挺多. 算是第一次接触LDAP吧,之前曾经做了一个登录的验证,就是查询功能,那个相对比较简单,用到了一个方法就搞定了. 这次的需求是要用编程的方式创 ...

  8. Ansible@一个有效的配置管理工具--Ansible configure management--翻译(四)

    不要未经书面许可转载 第三章是长,因为,我会分几个部分来翻译. Advanced Playbooks So far the playbooks that we have looked at are s ...

  9. UVALive 4730 Kingdom +段树和支票托收

    主题链接:点击打开链接 题意见白书P248 思路: 先把读入的y值都扩大2倍变成整数 然后离散化一下 用线段树来维护y轴 区间上每一个点的 城市数量和联通块数量. 然后用并查集维护每一个联通块及联通块 ...

  10. 博客测试:博客系统i94web beta1.0 申请测试

    如何做了最近的博客更新,因为已经在线路和代码,我写了一个小博客系统:i94web,草草宣布beta1.0,请求您测试各种漏洞. 先看几张截图. 首页: watermark/2/text/aHR0cDo ...