扁平化(译注:用“缩减”更直观)视图层级现在(其实是大部分时候)透支是要注意的事情,让我们回到层级查看器。通过检查层级树,我们可以尝试识别不必要的视图。删除视图,尤其是视图组,不仅可以帮助提高帧速率,而且可以减少内存消耗和启动时间等等。 快速浏览一下Falcon Pro的视图层级,足以识别几个只有一个单独子视图的视图组。这些视图组通常是不必要的,很容易去除。至少下面截图中显示的节点中的两个应该被删除。 有许多其他的视图可以从这棵树中移除。例如,每个包含名为 id/listElementBottom的 RelativeLayout的tweet(译者注:在Twitter上发布的消息)。此布局包含了作者的名字,他的Twitter地址,这条tweet发布过后的时间,和一个图标。作者名称和Twitter地址是两个单独的 TextView而不是仅用一个,是为了使用不同风格。时间和图标使用一个 TextView 和一个 ImageView,可以使用 TextView的复合画板功能合并成一个 TextView。
左边的滑入式菜单使用了几组 LinearLayout+TextView+ImageView 来显示带图标的标签。每一组都可以用一个单独的TextView来替换。 输入事件处理 还记得当我们在看systrace的时候发现触摸事件响应处理有一些延迟吗?现在就是解决这个问题的时候啦。traceview就是处置这种问题和了解应用正在做什么的最好的工具。 Traceview是一个测量应用的方法调用所耗时间的Dalvik分析器。怎样使用它呢?在ADT或者监视器中打开DDMS视图,在Devices选项卡中选择您的应用的进程,然后点击“start method profiling”按钮(就是一个红色圈圈和三个箭头的那个按钮)。 开启追踪之后,在主时间轴上选取开始和结束时间,再次点击按钮来完成跟踪。您也可以下载 我的程序调试信息。结果如下。 点击第21行,ViewRootImpl.draw(),该方法调用时间将会高亮。表的最后一行将会给出这个方法及其子方法的平均调用时间。如果你仔细看时间轴上的高亮处,你会发现连续帧之间的差别。 一个弄清楚这些差别之间是怎么回事的简易方法就是在差别开始出现的地方逐渐放大,然后点击其中最大的彩色块。跟踪父链直到找到你的问题所在。在这个案例中,我跟踪了Pattern.compileImpl方法的调用(平均调用时间为0.5ms),找到了DBListAdapter.bindView方法. 试试吧,少年!最后一个调试给大家留作练习。这是一个包含两个菜单可以向左或向右滑动切换的应用。但是我在使用openGL调试工具调试时发现在菜单滑动切换的时候产生了大量的画图消耗。下载我的调试,看看是什么原因造成了这种现象吧(去到第34帧。)
我们一起学习了多种优化应用的工具。虽然我可以花大量的时间来讲解选用何种技术来解决解决特定问题,但是那样的话这篇文章就会显得太臃肿了。android开发者官网上的提供文档和Google I/O大会有关于android的讨论(网上有免费的幻灯片和视频)也许能够帮助你。
|