Android性能优化-布局优化

在上一篇博客中,我和大家一起探讨了在Android中对SQLite数据库的操作优化细节。还没有看的点击这里:Android性能优化-SQLite数据库

今天,我们继续Android性能优化系列 - 布局优化。在Android中,UI布局作为展示性的标志,显示的速度直接体现了一个App对于客户直观的影响。一个好的App,在布局和UI上肯定有比较好的性能优化,所以布局优化成为了Android性能优化的有一个重点。

Android中关于布局优化,系统为我们提供了几个抽象的标签:

(1)include

(2)viewstub

(3)merge

下面,我们就来一一介绍三个标签的作用和使用方式。

1> include

顾名思义,include标签可以让我们复用包含一个layout布局。例如,我们App在大部分情景下都是这样的设计:topbar -> content -> footbar。

那么,很多界面都是这样的布局,我们就可以抽取出topbar和footbar作为公共布局,使用include就可以复用该布局,下面看代码:

这是一个头布局:layout_topbar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="46dp"
        android:id="@+id/rl_root_title_base"
        >
        <TextView
            android:id="@+id/tv_left_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:gravity="center_vertical"
            android:textColor="#80C469"
            />
        <TextView
            android:id="@+id/tv_topic_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:textColor="@color/cl_font_46"
            android:textSize="18dp"
            android:maxLength="10"
            android:ellipsize="end"
            android:singleLine="true"
            />
        <TextView
            android:id="@+id/tv_right_first_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:gravity="center"
            android:minHeight="30dp"
            android:minWidth="30dp"
            android:layout_marginRight="10dp"
            android:textSize="16dp"
            android:textColor="@color/cl_80c469"
            />

        <TextView
            android:id="@+id/tv_right_second_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
               android:layout_toLeftOf="@id/tv_right_first_title"
            android:layout_centerVertical="true"
            android:gravity="center"
            android:minHeight="30dp"
            android:minWidth="30dp"
            android:layout_marginRight="10dp"
            android:textColor="#80C469"
            />
    </RelativeLayout>
   <View
       android:id="@+id/line_root_base"
       android:layout_width="match_parent"
       android:layout_height="0.5dp"
       android:background="@color/cl_font_ea" />
</LinearLayout>

main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <include layout="@layout/layout_top" />
</LinearLayout>

上面代码中我们使用include的属性layout来重用topbar布局。include还可以指定layout_width和layout_height以及id。如果指定了id属性,则被包含的根布局id将会失效,此id将会被覆盖。

2> viewstub

viewstub标签和include标签很相似,都是使用layout属性来加载一个布局。不同之处是include标签用来重用布局,该布局会在App启动加载时被加载进内存。而viewstub标签所引用的布局是不会被加载出来的,只有当你在某个时间需要使用时才会被加载出来,从而在解析layout时节省了cpu加载时间和内存的占用。

使用也非常简单,看下面代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <ViewStub
        android:id="@+id/vstub_network_error"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout="@layout/layout_network_error"
        />
</LinearLayout>

在布局代码中,我们使用ViewStub的layout来加载一个布局。

private void showEmptyView() {

    if(ValidateUtils.isNullObj(viewNetWorkError)){

        ViewStub mViewStub = (ViewStub) findViewById(R.id.vstub_network_error);
        viewNetWorkError = mViewStub.inflate();
    } else {

        viewNetWorkError.setVisibility(View.VISIBLE);
    }
}
private void showCourseContent(Course course) {
    if(ValidateUtils.isNotNullObj(viewNetWorkError)) {
        viewNetWorkError.setVisibility(View.GONE);
    }
}

我们在代码中通过findViewById来获取ViewStub,然后调用其inflate方法就可以获取到layout的view。

ViewStub的使用场景很广泛:例如显示加载失败的界面,进度布局显示,信息出错提示等等。

3> merge

merge标签用来取消layout的层级的显示。大家都知道,Android顶级布局DecorView的根布局是让FrameLayout。此时在我们的布局中如果我们使用FrameLayout,就会造成布局节点的层级叠加重复绘制。Android为我们提供了一个叫做hierarchy viewer来查看布局节点信息。该工具在sdk/tools目录下。

要注意的一点是,merge标签必须作为布局的根标签,即不能嵌套在其他布局中。

使用很简单,就不贴代码了。

介绍完了以上3个抽象标签的使用方式,想必大家都知道该如何去应用在自己的布局中来优化布局,下面还有几点同时也需要大家去关注一下:

(1)inflate:大家都知道,inflate用来在代码中加载一个现有的布局。例如我们可以使用LayoutInflater.from().inflate()来发加载,同时也可以在Activity中使用getLayoutInflater().inflate()来加载一个布局。但是每次使用inflate去加载布局是有时间和内存消耗的。所以我们要利用复用View来减少不必要的重复inflate。例如上面我们在介绍ViewStub的时候会去inflate。此时我们就可以将该View当做全局变量。下次只需要判断下是否为null,就可以去重复使用,而不必每次都inflate加载了。

(2)ListView Adapter的getView方法:在该方法中我们都会去inflate一个布局,然后设置一些数据,最后return该View。ListView在每一个Item被渲染加载时都回去重复调用getView。并且ListView的convertView是可以重复利用的,所以我们可以利用ViewHolder的原理来复用convertView,而不必每次都inflate。

(3)使用SurfaceView和TextureView:SurfaceView和TextureView不会占用UI Thread来加载渲染视图,他们都会开启一个线程来异步进行加载。所以可以使用他们来优化加载速度及显示效果。

(4)尽量为所有分辨率创建资源:减少不必要的硬件缩放,这样会降低UI的绘制速度和占用大量的内存消耗。

注意:之前看到网上很多朋友说将View的可见性设置为gone。该View同样不会被加载到内存。其实这种说法是错误的。从Android源码可以知道,即使将View的visiablity设置为gone,View同样会被加载的内存资源当中。即只有只有ViewStub加载的layout在App启动后才不会被加载到内存资源。

好了,关于布局优化的内容就介绍到这里了。更多的东西还需要大家去尝试一下。下一篇我将和大家分享 Android性能优化
一 数据优化

时间: 2024-09-29 10:00:30

Android性能优化-布局优化的相关文章

关于android性能,内存优化(转载)

原文地址:http://www.cnblogs.com/zyw-205520/archive/2013/02/17/2914190.html   转自(http://www.starming.com/index.php?action=plugin&v=wave&tpl=union&ac=viewgrouppost&gid=74&tid=20713&pg=1) 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都

Android开发之布局优化

1.抽象布局标签 (1) <include>标签 include标签经常使用于将布局中的公共部分提取出来供其它layout共用,以实现布局模块化.这在布局编写方便提供了大大的便利. 以下以在一个布局main.xml中用include引入还有一个布局foot.xml为例.main.mxl代码例如以下: Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?xml version="1.0" encoding="utf-8"?

关于android性能,内存优化

随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要 求远远高于PC的桌面应用程序.以上理由,足以需要开发人员更加专心去实现和优化你的代码了.选择合适的算法和数据结构永远是开发人员最先应该考虑的事 情.同时,我们应该时刻牢记,写出高效代码的两条基本的原则:(1)不要做不必要的事:(2)不要分配不必要的内存. 我从去年开始接触Android开发,以下结合自己的一点项目经验,同时参考了Google的优化文档和网

我的Android进阶之旅------&gt;Android中的布局优化 include、merge 、ViewStub

1.如何重用布局文件? 可以使用<include>标签引用其他的布局文件,并用android:id属性覆盖被引用布局文件中顶层节点的android:id属性值.代码如下: <!--引用mylayout.xml--> <include android:id="@+id/layout1" layout="@layout/mylayout"/> 2.减少视图层级<merge /> 无论布局文件的根节点是什么,系统都会在上一层

android 性能分析、优化

1.主要介绍了一些分析工具,比如GT.ITest等http://www.jianshu.com/p/8b77d394b2a6 2.详细介绍啦android平台常见性能优化工具http://blog.csdn.net/yanbober/article/details/48394201例如:UI方面:android系统提供的GPU OverDraw 过度绘制工具:GPU呈现模式分析等. Lint快速分析不合理懂UI布局:HierarchyViewer 具体分析View布局.内存方面:介绍了Memor

Android性能优化之一 布局优化

本文为Android性能优化--布局优化,主要介绍使用抽象布局标签(include, viewstub, merge).去除不必要的嵌套和View节点.减少不必要的infalte及其他Layout方面可调优点,顺带提及布局调优相关工具(hierarchy viewer和lint). 一.布局复杂度的优化 关于布局的优化,主要分两个大方向 实现相同界面效果并且层级结构相同时,选用何种Layout最好 在Android中单独的布局性能: FrameLayout>LinearLayout>Relat

Android性能优化的一些理解

前言 Android性能优化对Android程序的维护和拓展是有很大帮助的,我们知道Android手机不管是内存还是CPU都无法同PC相比,这也就意味着我们必须要谨慎的去使用内存和CPU资源.因为稍稍不注意可能就会引发诸如OOM.ANR.内存泄漏等问题,所以熟悉Android性能优化的几个方法可以有效地提高应用程序的性能,我们可能都能说出一些性能优化的方法,比如布局优化.绘制优化.线程优化等等,但是可能我们会忽视某些小细节,比如布局优化我们可能都知道可以使用< include >来减少布局的层

Android 性能优化

上周四参加了MDCC大会的 Android,我比较关注的5R,做一个安静的app,图片缓存以及React Native For Android,其中很大一部分的内容都是讲的性能优化,后续还会给大家带来一篇React Native ,下面就来总结一下Android性能优化方面的内容! Reduce Cache/Drawable load in demand bitmap - scale/format Reuse pools inBitmaps convertView onDraw / for Re

Android性能优化总结(转)

前言 性能优化本身是一个很大的主题,涵盖程序的方方面面,任何不慎的操作,都有可能对性能造成比较大的影响,要知道程序的性能是可以累加的,多处的性能低下, 会影响整体的性能,其后果可能也是多方面的,本文总结了目前工作中,所需要知道的大部分性能优化点,一部分个人总结,一部分来自于互联网.但整体上,都是 提纲性的,并没有列出具体的实例,因为写这方面主题的达人实在太多了,所以,我得站在巨人的肩膀上,具体细节,请参考对应的链接. 性能低下的现象 游戏:界面很卡,FPS低 搜索性能差 服务器响应速度慢 OS: