50个Android开发技巧(02 延迟载入和避免反复渲染视图)
2016-04-01 15:04
447 查看
当你在Application中创建复杂的布局时。页面的渲染过程也变得更加缓慢。
此时,我们须要利用 <include />标签(避免反复渲染)和 ViewStub类(延迟载入)来优化我们的页面。
(原文地址:http://blog.csdn.net/vector_yi/article/details/24402101)
一、利用<include />标签来避免反复渲染
当我们须要为App中的每一个View都加入一个header或者footer时,你会怎么做?
反复地复制粘贴能够解决问题,但未免太繁杂。能够试着使用<include />标签:
第一种方式。在<include />标签内指定width及height:
main.xml
footer.xml
[align=left]有个小细节须要注意。在footer.xml中,我们将width及height都设为0dp.目的是为了配合<include/>标签中对width及height的定义。[/align]
[align=left]另外一种方式。直接引用:[/align]
[align=left]main.xml[/align]
footer.xml
[align=left]二、利用ViewStub类来延迟载入视图[/align]
[align=left]在设计视图时,有时会考虑到某些视图的可见性是依赖于用户的操作或者执行设备的详细环境的。[/align]
[align=left]此时你会怎样设计?不过改变View的visible属性?[/align]
[align=left]我们先来看看ViewStub的介绍:[/align]
ViewStub是一个不可见、不占空间(zero-sized)的控件。它能够用来在执行时延迟载入视图资源。仅仅有当我们将ViewStub的可见性设为true。或者调用inflate()方法,它的视图资源才会被载入。
[align=left]如果我们设计的一个页面中包括地图View,试想一下下面这样的情况:[/align]
有些用户不须要看到地图。
[align=left]既然用户不须要看到地图,我们为何还坚持不懈地载入它?这反而影响了我们App的Performance。[/align]
[align=left]此时,我们就能够利用ViewStub类了:[/align]
[align=left]main.xml[/align]
map.xml
接下来看看MainActivity
如你所见。在须要显示图像时我们才调用onShowMap来改变map_stub的可见性。在改变之前。map_stub都不会渲染载入视图资源。
[align=left]小结:[/align]
[align=left] 1.当我们的页面变得复杂,XML文件内容过多时。<include />标签能够有效地帮助我们整理文件内容,同一时候提高了XML文件的可读性。同一时候,它的使用方法也与Fragment类似。[/align]
2.ViewStub是一个极佳的延迟载入视图资源的方式。仅仅要你设计的视图是依赖于上下文来改变其可见性的,就利用ViewStub类吧。
或许当你仅仅将其应用在一个简单的页面其中时,并不会感觉到在性能上有不论什么提升,可是在复杂页面中,它的效果是极佳的。
此时,我们须要利用 <include />标签(避免反复渲染)和 ViewStub类(延迟载入)来优化我们的页面。
(原文地址:http://blog.csdn.net/vector_yi/article/details/24402101)
一、利用<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" />
[align=left]有个小细节须要注意。在footer.xml中,我们将width及height都设为0dp.目的是为了配合<include/>标签中对width及height的定义。[/align]
[align=left]另外一种方式。直接引用:[/align]
[align=left]main.xml[/align]
<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" />
[align=left]二、利用ViewStub类来延迟载入视图[/align]
[align=left]在设计视图时,有时会考虑到某些视图的可见性是依赖于用户的操作或者执行设备的详细环境的。[/align]
[align=left]此时你会怎样设计?不过改变View的visible属性?[/align]
[align=left]我们先来看看ViewStub的介绍:[/align]
ViewStub是一个不可见、不占空间(zero-sized)的控件。它能够用来在执行时延迟载入视图资源。仅仅有当我们将ViewStub的可见性设为true。或者调用inflate()方法,它的视图资源才会被载入。
[align=left]如果我们设计的一个页面中包括地图View,试想一下下面这样的情况:[/align]
有些用户不须要看到地图。
[align=left]既然用户不须要看到地图,我们为何还坚持不懈地载入它?这反而影响了我们App的Performance。[/align]
[align=left]此时,我们就能够利用ViewStub类了:[/align]
[align=left]main.xml[/align]
<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都不会渲染载入视图资源。
[align=left]小结:[/align]
[align=left] 1.当我们的页面变得复杂,XML文件内容过多时。<include />标签能够有效地帮助我们整理文件内容,同一时候提高了XML文件的可读性。同一时候,它的使用方法也与Fragment类似。[/align]
2.ViewStub是一个极佳的延迟载入视图资源的方式。仅仅要你设计的视图是依赖于上下文来改变其可见性的,就利用ViewStub类吧。
或许当你仅仅将其应用在一个简单的页面其中时,并不会感觉到在性能上有不论什么提升,可是在复杂页面中,它的效果是极佳的。
相关文章推荐
- Android 如何判断一个应用正在运行
- Android 开发实战经验总结
- android项目搭建
- android 如何去掉标题栏
- Android保持屏幕常亮
- Android service
- Android FrameWork——Activity启动过程详解
- Android studio运行时乱码 编码问题 閿欒: 缂栫爜UTF-8鐨勪笉鍙槧灏勫瓧绗?
- androidstudio MultiDex慎用
- Android Studio “懒人”必备插件android layout id converter
- [置顶] Android开发之封装log打印日志的工具类,实用logutils详细代码
- 移动端js判断iPhone浏览器还是Android浏览器
- 安卓为Dialog设置属性动画
- Android studio 百度地图开发(4)触摸选点、地理编码
- Android 常见内存泄漏的解决方案
- android 第三方分享
- Android线程优先级
- Android适配全攻略(学习笔记总结)
- Android Activity学习笔记——Activity的启动和创建
- GitHub 上排名前 100 的 Android 开源库进行简单的介绍