UDN-企业互联网技术人气社区

板块导航

浏览  : 1061
回复  : 0

[移动平台] 50个Android开发技巧( 延迟加载和避免重复渲染视图)

[复制链接]
ミ弑桖龍鯎的头像 楼主
发表于 2015-12-5 21:15:49 | 显示全部楼层 |阅读模式
  当你在Application中创建复杂的布局时,页面的渲染过程也变得更加缓慢。

  此时,我们需要利用 <include />标签(避免重复渲染)和 ViewStub类(延迟加载)来优化我们的页面。

  一、利用<include />标签来避免重复渲染

  当我们需要为App中的每个View都添加一个header或者footer时,你会怎么做?

  重复地复制粘贴可以解决这个问题,但未免太繁杂。可以试着使用<include />标签:

  第一种方式,在<include />标签内指定width及height:
  main.xml
  1. <RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"  
  2.     android:layout_width= "fill_parent"  
  3.     android:layout_height= "fill_parent" >  
  4.     <Button  
  5.         android:layout_width ="fill_parent"  
  6.         android:layout_height ="wrap_content"  
  7.         android:layout_gravity ="center_vertical"  
  8.         android:onClick ="onShowMap"  
  9.         android:text ="@string/show_map" />  
  10.     <include  
  11.         android:layout_width ="fill_parent"  
  12.         android:layout_height ="wrap_content"  
  13.         android:layout_alignParentBottom ="true"  
  14.         android:layout_marginBottom ="30dp"  
  15.         layout ="@layout/footer" />  
  16. </RelativeLayout>  
复制代码

  footer.xml

  1. <TextView xmlns:android = "http://schemas.android.com/apk/res/android"  
  2.     android:layout_width= "0dp"  
  3.     android:layout_height= "0dp"  
  4.     android:gravity= "center"  
  5.     android:text= "@string/footer_text" />  
复制代码


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

  第二种方式,直接引用:

  main.xml

  1. <RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"  
  2.     android:layout_width= "fill_parent"  
  3.     android:layout_height= "fill_parent" >  
  4.     <Button  
  5.         android:layout_width ="fill_parent"  
  6.         android:layout_height ="wrap_content"  
  7.         android:layout_gravity ="center_vertical"  
  8.         android:onClick ="onShowMap"  
  9.         android:text ="@string/show_map" />  
  10.     <include layout ="@layout/footer" />  
  11. </RelativeLayout>  
复制代码

  footer.xml

  1. <TextView xmlns:android = "http://schemas.android.com/apk/res/android"  
  2.     android:layout_width= "fill_parent"  
  3.     android:layout_height= "wrap_content"  
  4.     android:layout_alignParentBottom= "true"  
  5.     android:layout_marginBottom= "30dp"  
  6.     android:gravity= "center"  
  7.     android:text= "@string/footer_text" />  
复制代码


  二、利用ViewStub类来延迟加载视图

  在设计视图时,有时会考虑到某些视图的可见性是依赖于用户的操作或者运行设备的具体环境的。

  此时你会如何设计?仅仅是改变View的visible属性?

  我们先来看看ViewStub的介绍:
     ViewStub是一个不可见、不占空间(zero-sized)的控件,它可以用来在运行时延迟加载视图资源。只有当我们将ViewStub的可见性设为true,或者调用inflate()方法,它的视图资源才会被加载。
假设我们设计的一个页面中包含地图View,试想一下以下这种情况:
     
  有些用户不需要看到地图。既然用户不需要看到地图,我们为何还坚持不懈地加载它?这反而影响了我们App的Performance。
此时,我们就可以利用ViewStub类了:
  main.xml

  1. RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"  
  2.     android:layout_width= "fill_parent"  
  3.     android:layout_height= "fill_parent" >  
  4.     <Button  
  5.         android:layout_width ="fill_parent"  
  6.         android:layout_height ="wrap_content"  
  7.         android:layout_gravity ="center_vertical"  
  8.         android:onClick ="onShowMap"  
  9.         android:text ="@string/show_map" />  
  10.     <ViewStub  
  11.         android:id ="@+id/map_stub"  
  12.         android:layout_width ="fill_parent"  
  13.         android:layout_height ="fill_parent"  
  14.         android:inflatedId ="@+id/map_view"  
  15.         android:layout ="@layout/map" />  
  16. </RelativeLayout>
复制代码

  map.xml

  1. <com.google.android.maps.MapView xmlns:android ="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width= "fill_parent"  
  3.     android:layout_height= "fill_parent"  
  4.     android:APIKey= "my_api_key"  
  5.     android:clickable= "true" />  
复制代码


  接下来看看MainActivity

  1. public class MainActivity extends MapActivity {  
  2.   private View mViewStub;  
  3.   @Override  
  4.   public void onCreate (Bundle savedInstanceState ) {  
  5.     super. onCreate( savedInstanceState );  
  6.     setContentView( R. layout. main);  
  7.     mViewStub = findViewById( R. id. map_stub);  
  8.   }  
  9.   public void onShowMap (View v) {  
  10.     mViewStub. setVisibility (View .VISIBLE );  
  11.   }  
  12. ....  
  13. }  
复制代码

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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部