新技能get:Android应用优化技能之“延迟加载”术

世风日下,人心不古。

如今四海虽看似太平,其实却暗藏杀机。大到一架飞机一辆公交,小到一个app,都会让您抓狂。

越来越复杂的界面,越来越多的需求,对app来说本身来说就是一个噩耗,但在人类无穷的想象力,在功能模块无情的堆积之下,对于应用来说,要么瘦,要么死!

那么如何瘦,怎么瘦?对广大爱美的程序员和产品和用户来说,只有简约,按需才是王道。

旁白:写文章就写文章嘛,废话太多了!

【这是正题】上面一堆废话其实也是有两个有用的词汇的,简约和按需。简约是设计要想的,那么按需就是我们程序将要做的。

【按需:延迟加载】所谓的延迟加载就是不在初始化界面的时候加载部分view,在需要的时候才加载,在布局多控件的时候能有效的提升界面的加载和响应速度。

【我们普遍在使用的按需加载】稍微有些经验的android开发程序员都会懂得把一些复杂界面里的一些模块单独用一个xml写的layout独立写,然后在需要的时候把它们inflate()到程序中来,这样达到延迟加载的目的。这样做在界面不确定,需要多次实例化view或者根据数据遍历产生view的时候会很方便,完全由java代码实现。那么如果我们在界面元素确定并且需要延时加载的时候有没有更直观的做法呢?当然有:使用viewStub.

【一个轻量级的控件:viewStub】如名字的含义,只是一个view的存根,不占什么内存(区别于<include>),但却可以占个位置,在程序需要的时候把viewStub指向的view扩展到界面。依照惯例,在我要举例子的这个时候代码会悄悄袭来--》

 1 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     tools:context=".MainActivity" >
 6
 7     <LinearLayout
 8         android:id="@+id/main"
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:orientation="vertical"
12         android:paddingBottom="@dimen/activity_vertical_margin"
13         android:paddingLeft="@dimen/activity_horizontal_margin"
14         android:paddingRight="@dimen/activity_horizontal_margin"
15         android:paddingTop="@dimen/activity_vertical_margin" >
16
17         <TextView
18             android:layout_width="wrap_content"
19             android:layout_height="wrap_content"
20             android:text="所谓的延时加载就是不在初始化界面的时候加载部分view,在需要的时候才加载,在布局多控件的时候能有效的提升界面的响应速度。"/>
21
22         <Button
23             android:id="@+id/btn_by_inflate"
24             android:layout_width="match_parent"
25             android:layout_height="wrap_content"
26             android:text="普通inflate方式" />
27
28         <Button
29             android:id="@+id/btn_by_viewstub"
30             android:layout_width="match_parent"
31             android:layout_height="wrap_content"
32             android:text="viewStub方式" />
33
34         <ViewStub
35             android:id="@+id/viewstub"
36             android:layout_width="match_parent"
37             android:layout_height="wrap_content"
38             android:inflatedId="@+id/inflate_view_id"
39             android:layout="@layout/delay_by_viewstub" />
40     </LinearLayout>
41
42 </ScrollView>

这是我们主界面xml中定义的ViewStub,需要注意的有三点:id->stub的id,根据这个取stub对象;inflatedId->扩展出的视图id(即指向的视图的id,可以不定义);layout->将要inflate的layout。好的,太直观了,不用再解释什么了。

有了存根,那么我们怎么在程序需要的时候取得?寥寥几句,view轻松到手。

 1 package com.change.delayloaddemo;
 2
 3 import android.app.Activity;
 4 import android.graphics.Color;
 5 import android.os.Bundle;
 6 import android.view.Menu;
 7 import android.view.View;
 8 import android.view.View.OnClickListener;
 9 import android.view.ViewStub;
10 import android.widget.Button;
11 import android.widget.LinearLayout;
12 import android.widget.TextView;
13
14 /**
15  * 两种延迟加载方式Demo android推荐采用viewStub方式。
16  *
17  * @author Change
18  *
19  */
20 public class MainActivity extends Activity implements OnClickListener {
21     private LinearLayout main;
22     private TextView normalInflate, delayByViewStub;
23     private ViewStub mStub;
24     private Button byInflate, byViewStub;
25
26     @Override
27     protected void onCreate(Bundle savedInstanceState) {
28         super.onCreate(savedInstanceState);
29         setContentView(R.layout.activity_main);
30         initViews();
31     }
32
33     private void initViews(){
34         main = (LinearLayout) findViewById(R.id.main);
35         byInflate = (Button)findViewById(R.id.btn_by_inflate);
36         byViewStub = (Button)findViewById(R.id.btn_by_viewstub);
37
38         byInflate.setOnClickListener(this);
39         byViewStub.setOnClickListener(this);
40     }
41
42     @Override
43     public boolean onCreateOptionsMenu(Menu menu) {
44         // Inflate the menu; this adds items to the action bar if it is present.
45         getMenuInflater().inflate(R.menu.main, menu);
46         return true;
47     }
48
49     @Override
50     public void onClick(View arg0) {
51         switch (arg0.getId()) {
52         case R.id.btn_by_inflate:
53             normalInflate = (TextView) getLayoutInflater().inflate(
54                     R.layout.delay_by_viewstub, null);
55             main.addView(normalInflate);
56             normalInflate.setText("我是通常的inflate方法加载的view");
57             normalInflate.setBackgroundColor(Color.parseColor("#00ffff"));
58             break;
59         case R.id.btn_by_viewstub:
60             mStub = (ViewStub)findViewById(R.id.viewstub);
61             if(null!=mStub)//mStub执行了一次inflate()方法之后会被置空,所以此处判空
62             delayByViewStub = (TextView)mStub.inflate();
63 //            mStub.setVisibility(View.VISIBLE);//或者这样可以inflate出view.
64             break;
65
66         default:
67             break;
68         }
69     }
70
71 }

以上红色部分便是使用viewStub延迟加载的几句代码。

【需要注意的点】viewStub在执行完inflate()方法或者setVisibility(View.VISIBLE)方法之后会被置空,不能再使用该对象。

【完整代码】demo的github地址:https://github.com/ChangeWu/SomePoject/tree/master/DelayLoadDemo

新技能get:Android应用优化技能之“延迟加载”术

时间: 2024-08-27 10:16:18

新技能get:Android应用优化技能之“延迟加载”术的相关文章

Android开发工程师,新长征路上的14项技能

导读: 你曾渴望回到宋朝吗? 或者什么朝,反正就是男耕女织的古代. 哦,那时的首都在汴梁(开封),房价想必没有这么高,工作?无非就是给你把锄头,去,种地去.夕阳西下了,麦子垛后,你和翠姑搂抱在一起,那时的你,生活的简单而美好. 看看现在的你,一个刚入门的安卓开发工程师,没有信用卡,没有她,没有24小时热水的家.你想念你的锄头和翠姑(或麦垛),可你回不去了,你现在手中的安卓手机,冰冷如铁,你不知道如何在这4寸屏的小东西上打出一片天地. 你不用感到不知所措和困惑,技术就是你安身立命的根本,当下,你的

这是一份集合一线大厂Android工程师必备技能体系+学习路线!

一份学习路线图,非常赞,推荐给大家. 目录 Java基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap 和 HashTable 区别 HashCode 作用,如何重载hashCode方法 ArrayList与LinkList区别与联系 GC机制 Java反射机制,Java代理模式 Java泛型 Synchronized原理 Volatile实现原理 方法锁.对象锁.类锁的意义和区别 线程同步的方法:Synchronized.lo

android内存优化3—从代码角度进行优化

通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能.下面我们就从几个方面来了解Android开发过程中的代码优化. 1)静态变量引起内存泄露 在代码优化的过程中,我们需要对代码中的静态变量特别留意.静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁.所以,一般情况下,静态变量

Google 发布 Android 性能优化典范

2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议.主要从三个 方面展开,Android的渲染机制,内存与GC,电量优化.下面是对这些问题和建议的总结梳理. 0)Render Performance 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能.从设计

Android 性能优化 三 布局优化ViewStub标签的使用

小黑与小白的故事,通过虚拟这两个人物进行一问一答的形式来共同学习ViewStub的使用 小白:Hi,小黑,ViewStub是什么?听说可以用来进行布局优化. 小黑:ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件.(更多详细的API等信息可以查看官方文档ViewStub),计算机行业一向是实践里面出真知,下面用一个例子演示下效果. 小黑:说说概念只是为了概括性的了解下,还是用个实例来演示下.先来创建一个Activity中使用的布局文件,文件名是:act

Android APK优化工具Zipalign详解

最近在googl play上发布apk要优化 Android SDK中包含一个"zipalign"的工具,它能够对打包的应用程序进行优化.在你的应用程序上运行zipalign,使得在运行时Android与应用程序间的交互更加有效率.因此,这种方式能够让应用程序和整个系统运行得更快.我们强烈推荐在新的和已经发布的程序上使用zipalign工具来得到优化后的版本 一.这里下载android SDK,只为了用他的zipalign工具,当然什么时候大家有兴趣了用来开发两个小程序也是很简单的 A

android内存优化大全_上

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在ANDROID开发中遇到关于内存问题,或者马上要参加面试,或者就是单纯的学习或复习一下内存相关知识,都欢迎阅读.(本文最后我会尽量列出所参考的文章). 内存简介: RAM(random acc

Android性能优化的一些理解

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

Android调试优化篇

为了开发出商业级的应用程序,大规模的測试是不可避免的,同一时候为了提高应用程序的执行速度,须要进行必要的优化.在Android中.提供了丰富的调试与优化工具供开发者应用,主要包含模拟器和目标端等两种场景下使用的工具. 1.Android调试 软件调试是一个伴随软件开发的必定过程.好的调试环境和工具能够提高开发的效率.在Android中,除了提供GDB调试外.还提供了DNSS.Logcat.Dmtracedump.DevTools.Procrank.Dumpsys等开发工具供开发人员使用,当中DM