文档章节

50个Android开发技巧(02 延迟加载和避免重复渲染视图)

清雨傲客
 清雨傲客
发布于 2016/06/20 14:53
字数 908
阅读 15
收藏 0
当你在Application中创建复杂的布局时,页面的渲染过程也变得更加缓慢。
此时,我们需要利用 <include />标签(避免重复渲染)和 ViewStub类(延迟加载)来优化我们的页面。
一、利用<include />标签来避免重复渲染

当我们需要为App中的每个View都添加一个header或者footer时,你会怎么做?
重复地复制粘贴可以解决这个问题,但未免太繁杂。可以试着使用<include />标签:

第一种方式,在<include />标签内指定width及height:
main.xml
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width= "fill_parent"
    android:layout_height= "fill_parent" >

    <Button
        android:layout_width ="fill_parent"
        android:layout_height ="wrap_content"
        android:layout_gravity ="center_vertical"
        android:onClick ="onShowMap"
        android:text ="@string/show_map" />

    <include
        android:layout_width ="fill_parent"
        android:layout_height ="wrap_content"
        android:layout_alignParentBottom ="true"
        android:layout_marginBottom ="30dp"
        layout ="@layout/footer" />

</RelativeLayout>

footer.xml
<TextView xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width= "0dp"
    android:layout_height= "0dp"
    android:gravity= "center"
    android:text= "@string/footer_text" />

有个小细节需要注意,在footer.xml中,我们将width及height都设为0dp.目的是为了配合<include/>标签中对width及height的定义

第二种方式,直接引用:
main.xml
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width= "fill_parent"
    android:layout_height= "fill_parent" >

    <Button
        android:layout_width ="fill_parent"
        android:layout_height ="wrap_content"
        android:layout_gravity ="center_vertical"
        android:onClick ="onShowMap"
        android:text ="@string/show_map" />

    <include layout ="@layout/footer" />

</RelativeLayout>

footer.xml
<TextView xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width= "fill_parent"
    android:layout_height= "wrap_content"
    android:layout_alignParentBottom= "true"
    android:layout_marginBottom= "30dp"
    android:gravity= "center"
    android:text= "@string/footer_text" />

二、利用ViewStub类来延迟加载视图
在设计视图时,有时会考虑到某些视图的可见性是依赖于用户的操作或者运行设备的具体环境的。
此时你会如何设计?仅仅是改变View的visible属性?
我们先来看看ViewStub的介绍:
      ViewStub是一个不可见、不占空间(zero-sized)的控件,它可以用来在运行时延迟加载视图资源。只有当我们将ViewStub的可见性设为true,或者调用inflate()方法,它的视图资源才会被加载。

假设我们设计的一个页面中包含地图View,试想一下以下这种情况:
     有些用户不需要看到地图。
既然用户不需要看到地图,我们为何还坚持不懈地加载它?这反而影响了我们App的Performance。
此时,我们就可以利用ViewStub类了:
main.xml
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width= "fill_parent"
    android:layout_height= "fill_parent" >

    <Button
        android:layout_width ="fill_parent"
        android:layout_height ="wrap_content"
        android:layout_gravity ="center_vertical"
        android:onClick ="onShowMap"
        android:text ="@string/show_map" />

    <ViewStub
        android:id ="@+id/map_stub"
        android:layout_width ="fill_parent"
        android:layout_height ="fill_parent"
        android:inflatedId ="@+id/map_view"
        android:layout ="@layout/map" />
</RelativeLayout>

map.xml
<com.google.android.maps.MapView xmlns:android ="http://schemas.android.com/apk/res/android"
    android:layout_width= "fill_parent"
    android:layout_height= "fill_parent"
    android:apiKey= "my_api_key"
    android:clickable= "true" />
接下来看看MainActivity
public class MainActivity extends MapActivity {

  private View mViewStub;

  @Override
  public void onCreate (Bundle savedInstanceState ) {
    super. onCreate( savedInstanceState );
    setContentView( R. layout. main);
    mViewStub = findViewById( R. id. map_stub);
  }

  public void onShowMap (View v) {
    mViewStub. setVisibility (View .VISIBLE );
  }
....
}

如你所见,在需要显示图像时我们才调用onShowMap来改变map_stub的可见性。在改变之前,map_stub都不会渲染加载视图资源。

小结:
     1.当我们的页面变得复杂,XML文件内容过多时,<include />标签可以有效地帮助我们整理文件内容,同时提高了XML文件的可读性。同时,它的用法也与Fragment类似。
     2.ViewStub是一个极佳的延迟加载视图资源的方式。只要你设计的视图是依赖于上下文来改变其可见性的,就利用ViewStub类吧。也许当你只将其应用在一个简单的页面当中时,并不会感觉到在性能上有任何提升,但是在复杂页面中,它的效果是极佳的。


本文转载自:http://blog.csdn.net/vector_yi/article/details/24402101

清雨傲客
粉丝 5
博文 47
码字总数 2538
作品 0
广州
程序员
私信 提问
50个Android开发技巧(02 延迟加载和避免重复渲染视图)

当你在Application中创建复杂的布局时,页面的渲染过程也变得更加缓慢。 此时,我们需要利用 <include />标签(避免重复渲染)和 ViewStub类(延迟加载)来优化我们的页面。 (原文地址:http://...

____追梦人
2015/11/24
30
0
Android 界面性能调优渲染+To检测+OverDraw+Rendering

界面是 Android 应用中直接影响用户体验最关键的部分。如果代码实现得不好,界面容易发生卡顿且导致应用占用大量内存。做 ROM 的公司更不一样,预装的应用一定要非常流畅,这样给客户或用户的...

程序猿拿Q
2018/11/15
126
0
为安卓开发者介绍的移动开发框架 Flutter

我是 TrueFace 的高级软件工程师 Adel Boussaken。今天我要给大家介绍 Flutter 开发。欢迎加入 Dart 阵营。 我将跳过所有有关安装和运行 Flutter 应用程序的部分,直接进行操作,如果您不确定...

oschina
2017/09/28
4.6K
11
Activity、Window、View三者关系

目录介绍 01.Window,View,子Window 02.什么是Activity 03.什么是Window 04.什么是DecorView 05.什么是View 06.关系结构图 07.Window创建过程 08.创建机制分析 8.1 Activity实例的创建 8.2 ...

潇湘剑雨
05/29
11
0
移动开发规范概述-alloyteam【腾讯】

移动开发规范概述 以下规范建议,均是Alloyteam在日常开发过程中总结提炼出的经验,规范具备较好的项目实践,强烈推荐使用 字体设置 iOS 4.0+ 使用英文字体 Helvetica Neue,之前的iOS版本降...

陈文亮
2015/02/28
9
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
今天
3
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
7
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部