Android性能优化一布局优化
布局优化的思路其实就一句话 : 尽量减少布局文件的层级
本篇博文的技术要点主要如下:
- 布局的策略以及几个重要的原则
- 使用
<include>
标签 - 使用
<merge>
标签 - 使用
<ViewStub>
标签 - 避免过度绘制
- 减少布局层级的N个技巧
- 检查布局的N个神兵利器
- 使用Lint
布局的策略以及几个重要的原则
安卓有三种常见的布局RelativeLayout、LinearLayout、FrameLayout,4.0以后又新增了GridLayout.
- 性能对比 : FrameLayout>LinearLayout>RelativeLayout
- LinearLayout灵活性比较低,比较难指定任意位置
- RelativeLayout每个控件都需要指定id,当删除修改控件时,修改较大
- 选择布局时,选择的优先级为 FrameLayout>LinearLayout>RelativeLayout,在不影响布局层级的情况下优先使用LinearLayout,而当布局层级太深,则需要更换其他的布局来减少层级
使用<include>
标签
当在多个xml布局文件中需要用到相同的一个布局,使用标签可以在多处复用这个布局,以减少代码冗余,增强代码复用性,
<include
android:id="@id/layout"
layout="@layout/test_layout" />
使用<merge>
标签
标签本身作用就是减少布局的层级
看一个最基本的布局,使用hierarchyviewer查看布局层级结构,看到了两个FrameLayout节点
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello World" />
</FrameLayout>
,将根布局改为
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello World" />
</merge>
两个FrameLayout节点合并为一个,为什么之前的xml布局中会有两个的FrameLayout节点?因为所有的Activity视图根节点都是FrameLayout,而我们所见的xml布局文件并没有显示该根节点. 所以如果创建的xml布局文件不是以FrameLayout为根节点,就不能使用<merge>
标签来进行优化,<merge>
标签本身的布局应该跟父布局一样,同理,也可以使用在<include>
标签当中
使用<ViewStub>
标签
有一个常见的场景,进入一个页面,当加载成功,显示正确内容,当加载失败,显示加载失败的布局内容.比较经常的一种做法就是写一个FrameLayout,然后去控制两个布局的显示和隐藏.使用<ViewStub>
,他本身不会占用层级,最后会被他指定的层级所取代,简单一句话就是按需加载,不过缺点就是只能替换一次,当替换完以后,<ViewStub>
就会从布局中消失,无法再次替换,用法比较简单
在布局中放置,然后在java代码中和普通控件一样控制它的的显示隐藏即可.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello World" />
<ViewStub
android:id="@+id/stub"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
避免过度绘制
打开开发者选项,有个显示cpu绘制,手机不同叫法也都不一样,不过大致都是这个意思 ,打开以后,就能看到过度绘制的情况,颜色的层级依次为蓝,浅绿,淡红,红,绘制次数依次为1-4,红色越多代表越多的过度绘制,以上的几种方法都能避免过度绘制,还有一种就是不要重复的去设置背景色
减少布局层级的N个技巧
生成一个脚注1.
检查布局的N个神兵利器
用 [TOC]
来生成目录:
使用Lint
使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.
- 行内公式,数学公式为: Γ(n)=(n−1)!∀n∈N 。
- 块级公式:
更多LaTex语法请参考 这儿.
UML 图:
可以渲染序列图:
或者流程图:
离线写博客
即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。
用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。
博客发表后,本地缓存将被删除。
用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。
注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱。
浏览器兼容
- 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
- IE9以下不支持
- IE9,10,11存在以下问题
- 不支持离线功能
- IE9不支持文件导入导出
- IE10不支持拖拽文件导入
- 这里是 脚注 的 内容. ↩