今天来总结一下Android中的性能优化,在很多面试过程中这个是一个提问频率很高的知识点之一。Android性能优化主要从几个方面来着手,主要包括布局优化,内存泄漏优化,响应速度优化,ListView优化,线程优化等,本篇博客将从布局优化中开始总结。
布局优化实质上就是减少布局的层级数,可以查看一下下面的布局,用到了多层布局嵌套,实际上上不合理的,需要优化的部分还很多。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
</RelativeLayout>
</LinearLayout>
第一步,删除布局中无用的控件和层级;
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</RelativeLayout>
第二步,使用性能较低的ViewGroup,官方推荐使用RelativeLayout,FrameLayout和LinearLayout都是一种简单高效的ViewGroup,很多时候单纯的通过LinearLayout或者FrameLayout不能满足布局效果,需要通过嵌套来完成,这种情况下使用RelativeLayout;
有没有想过为什么官方推荐使用RelativeLayout而不是LinearLayout?
使用了ViewGroup实际上就相当于增加了布局嵌套,RelativeLayout可以有利的降低使用多层布局嵌套带 来的问题;通俗一点来说,RelativeLayout中的子view可以通过id来控制位置方向,减少了多层布局嵌套,而LinearLayout的orientation属性已经确定了子view的位置方向,如有改变只能增加布局嵌套。
第三步,采用标签,主要为<include>,<merge>,<ViewStub>
一、 <include>标签
<include
android:id="@+id/no_data_view"
layout="@layout/layout_test"
android:layout_width="match_parent"
android:layout_height="match_parent" />
@layout/layout_test指定的事另外一个布局文件,主要用来引用多个相同的布局,比如常用的titleBar就可以单独的写成一个布局文件并用include引用;
二、<merge>标签
<merge>标签一般和<include>标签配套使用,如果当前布局的根布局是一个LinearLayout,并且include引用的外部布局的根布局也是LinearLayout的话,一般可以将外布局的根布局用<merge>标签来引用
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="button1" />
<Button
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="button2" />
</merge>
三、<ViewStub>标签,需要用到布局的时候再加载
ViewStub继承View且宽高都是0
<ViewStub
android:id="@+id/no_data_view"
layout="@layout/layout_test"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inflatedId="@+id/no_data_import" />
id:ViewStub本身的id
inflateId----->no_data_import:网络异常layout_test的根布局的id;
在需要加载ViewStub中的布局的时候,调用一下方法
ViewStub no_data_view = (ViewStub) findViewById(R.id.no_data_view);
no_data_view.setVisibility(View.VISIBLE);
以上为布局优化的重点,欢迎评价!