大家假设喜欢我的博客,请关注一下我的微博,请点击这里(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. java 产生的固体物的基础上 增删改的SQL声明

    经过多次修改.最后版本. package com.power.sql; import java.lang.reflect.Field; import java.lang.reflect.Modifie ...

  2. ITIL该研究的结论(互联网思维的结合)

    大约ITIL该研究的结论 最近,该公司与组织学习在一起ITIlV3一个Foundation知识. 学了几周了,每周两次课,是上海的同事在share她的理解. 事实上最開始,我个人差点儿没有听过ITIL ...

  3. Bubbles Shader in Houdini泡泡泡泡泡泡泡泡泡泡

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3Vja29u/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

  4. Webx相框:RequestContext详细说明

    RequestContext RequestContext它可以被看作是request和response飞度.多于RequestContext还可以串起来.喜欢Filter像链条. 每个外Reques ...

  5. malloc实现原理

    记得早一段时间,看到一本书上写过delete的一个..今天突然找啦一下资料: malloc()是C语言中动态存储管理 的一组标准库函数之中的一个.其作用是在内存的动态存储区中分配一个长度为size的连 ...

  6. IE8升级新版Flash Player ActiveX14导致的discuz图片附件无法上传 解决方法

    架不住sb adobe的频繁升级提示,手欠升级到了了flash player 14,结果IE8下全部discuz论坛中都无法看到上传图片的button了 没办法,遇到问题就解决吧 刚好在解决IE11遇 ...

  7. 深入理解ASP.NET MVC Day1

    深入理解ASP.NET MVC   ASP.NET vs MVC vs WebForms 许多ASP.NET开发人员开始接触MVC认为MVC与ASP.NET完全没有关系,是一个全新的Web开发,事实上 ...

  8. JS 添加到事件的多个对象

    费周折码如下面: 方法一: <em>v</em>ar pArys=document.getElementsByClassName("ps"); for(va ...

  9. 经典算法题每日演练——第十四题 Prim算法

    原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...

  10. measureChildren作品

    无论是在改写View依然是ViewGroup什么时候.特别ViewGrop什么时候,通常是不可避免的重写onMeasure方法,我们一定会调用setMeasuredDimension()将測量好的宽高 ...