[Android 性能优化系列]降低你的界面布局层次结构的一部分
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(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 性能优化系列]降低你的界面布局层次结构的一部分的更多相关文章
- Android性能优化系列之App启动优化
Android性能优化系列之布局优化 Android性能优化系列之内存优化 Android性能优化系列之apk瘦身 应用的启动速度缓慢是我们在开发过程中常常会遇到的问题,比方启动缓慢导致的黑屏.白屏问 ...
- [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...
- Android性能优化系列之apk瘦身
Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中.他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...
- [Android 性能优化系列]内存之基础篇--Android怎样管理内存
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...
- Android性能优化系列之电量优化
电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情,随着Android开的性能要求越来越高,电量的优化,也显得格外重要,一个耗电的应用,用户肯定会毫不犹豫的进行卸载,所 ...
- Android性能优化系列 + Android官方培训课程中文版
Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/ Android性能优化典范 - 第5季 htt ...
- Android性能优化系列总篇
目前性能优化专题已完成以下部分: 性能优化总纲——性能问题及性能调优方式 性能优化第四篇——移动网络优化 性能优化第三篇——Java(Android)代码优化 性能优化第二篇——布局优化 性能优化第一 ...
- Android性能优化系列---管理你的app内存
文章出处:http://developer.android.com/training/articles/memory.html#YourApp Random-access memory(RAM)在任 ...
- Android性能优化系列之Bitmap图片优化
https://blog.csdn.net/u012124438/article/details/66087785 在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitma ...
随机推荐
- 09应用输入经理旋转场景--《猿学校课程Unity3d》
为什么极品飞车游戏等.,我们可以通过系统设置非常的方面根据自己喜欢的操作模式设置,有些人喜欢用箭头来控制不喜欢与使用"W,S,A,D"控制,这就解释程序猿不会死在程序写入内部控制, ...
- 013实现使用两个堆栈队列(keep it up)
实现使用两个堆栈队列 FIFO队列是一种数据结构(FIFO),后堆叠前进出的数据结构的(FILO). 两个栈实现的最简单的方法就是排队:队列中的第一个推栈, 队列将数据顺序的第一个堆栈推入第二堆叠 ...
- ABP应用层——数据传输对象(DTOs)
ABP应用层——数据传输对象(DTOs) 基于DDD的现代ASP.NET开发框架--ABP系列之16.ABP应用层——数据传输对象(DTOs) ABP是“ASP.NET Boilerplate Pro ...
- LeetCodeOJ. Maximum Depth of Binary Tree
见问题: https://oj.leetcode.com/problems/maximum-depth-of-binary-tree/ 主题概述 Given a binary tree, find i ...
- JAVA转让JS功能
今天,在发展中使用js和Java互动.通常我们使用更多的是js转让Java方法.可以使用dwr.Ajax.jquery.突然发现Java转让js然后,我真的没见过,今天,互联网提供以下信息,顺便总结: ...
- Same binary weight (位运算)
题目描述 The binary weight of a positive integer is the number of 1's in its binary representation.for ...
- C#如何设置session过期时间
1.操作系统 步骤:开始——〉管理工具——〉Internet信息服务(IIS)管理器——〉网站——〉默认网站——〉 右键“属性”——〉主目录——〉配置——〉选项——〉启用会话状态——〉会话超时(在 ...
- Spring环境配置
研究spring3的时候发现一个非常好用的特性:环境配置(spring2是否有此特性未知) 官方演示样例代码例如以下: <!-- app-config.xml --> <beans ...
- Jquery实现 TextArea 文本框根据输入内容自动适应高度
原文 Jquery实现 TextArea 文本框根据输入内容自动适应高度 在玩微博的时候我们可能会注意到一个细节就是不管是新浪微博还是腾讯微博在转发和评论的时候给你的默认文本框的高度都不会很高,这可能 ...
- Android 2.3.5源码 更新至android 4.4,能够下载,度娘网盘
Android 4.4源代码下载(linux合并) ==============================切割线结束========================= 旧版本号的能够使用115, ...