细节决定成败----Android应用程序的优化(三)

从代码角度进行优化

一般,写程序都是在必定的项目压力下完成的,因此每每只注重完成具体的业务逻辑,性能每每不是最优的。此时,优秀的程序员在写完代码以后都会对代码进行重构。 php

1.静态变量引发的内存优化

静态变量的生命周期:从类被声明,到该类对象完全被GC回收。在这期间它会一直占用内存空间,若是静态变量引用了占用大量内存的资源,则容易形成OOM html

private static Resources mResources;

protected void onCreate(Bundle state) {
   super.onCreate(state);
   if(mResources == null) {
    mResources = this.getResources(); 
  }
}
下图能够解释使用静态变量容易出现的问题:



在实际项目中,常常会把一些对象的引用加入到集合中,若是这个集合是静态的话,就须要特别注意了。当不须要某对象时,务必及时把它的引用从集合中清理掉。或者能够为该集合提供一种更新策略,及时更新整个集合。 java

2. 使用Application的Context

Context生命周期:与应用程序的生命周期同样长,而不是取决于某个Activity的生命周期。 程序员

若是想保持一个长期生命的对象,而且该对象须要一个Context,就可使用Application对象了。因此,上面代码能够改成: 缓存

mResources = this.getApplication().getResources();
或者
mResources = Context.getApplication().getResources();
这里代码修改后,Resources对象拥有的是Application对象的引用。若是Activity被从新建立,第一次建立的Activity就能够被回收了。


3. 及时关闭资源

Cursor是Android查询数据后获得的一个管理数据集合的类。通常操做完毕后,需及时的关闭它。下面就是关于Cursor操做的通用代码片断: 性能

Cursor cursor = null;
try {
  cursor = mContext.getContentResolver().query(uri,null,null,null,null);
  if(cursor != null) {
     cursor.moveToFirst();
    //处理数据
}catch(Exception e) {
   e.printStatckTrace();
}finally{
   if(cursor != null) {
   cursor.close();
}
}
上述代码中,首先对异常进行捕获,而后在finally中将Cursor关闭。


4. 对Adapter进行优化

下面以构造ListView的BaseAdapter为例说明如何对Adapter进行优化。 优化

当ListView列表里的每一项显示时,都会调用Adapter的getView方法返回一个View,以向ListView提供所须要的View对象。下面的代码是通用的优化程度较高的代码: this

public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
if (convertView == null) {
      convertView = mInflater.inflate(R.layout.list_item, null);
      holder = new ViewHolder();
      holder.text = (TextView) convertView.findViewById(R.id.text);
      convertView.setTag(holder);
  } else {
      holder = (ViewHolder) convertView.getTag();
  }
  holder.text.setText("line" + position);
  return convertView;
}

private class ViewHolder {
  TextView text;
}

当向上滚动ListView时,getView()方法会被反复调用。getView()的第二个参数convertView是被缓存起来的List条目中的View对象。当ListView滑动的时候,getView可能会直接返回旧的convertView。这里使用了convertView和ViewHolder,能够充分利用缓存,避免反复建立View对象和TextView对象。 spa

若是ListView的条目只有几个,这种技巧并不能带来多少性能的提高。可是若是条目有几百甚至几千个,使用这种技巧只会建立几个convertView和ViewHolder(取决于当前界面可以显示的条目数),性能的差异就很是很是大了。 线程

要理解得更加透彻点能够看下这篇文章:http://dev.10086.cn/cmdn/wiki/index.php?doc-view-6985.html

5. 代码微优化

一般都是Java中代码的优化,但一样适用于Android,常见的优化有如下这些:

减小对象的建立,好比考虑单例模式;

将类、变量、方法的可见性修改成最小;

针对字符串的拼接,使用StringBuffer代替String;

不要再循环中声明临时变量,不要再循环中捕获异常;

使用集合对象时,若是事先知道其大小,则能够在构造方法中设置初始大小;

文件读取操做须要使用缓存类,及时关闭文件;

慎用异常,使用异常会致使性能下降;

若是程序频繁的建立线程,则能够考虑使用线程池。

这些优化都是程序构建过程当中很是广泛的优化,因此尽可能在刚开始写代码的时候就注意到。而后后期再根据具体的业务逻辑去专门针对某部分代码进行优化。

百度重口电影吧第一资源论坛-豚鼠湾www.tunshus.com

相关文章
相关标签/搜索