細節決定成敗----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

相關文章
相關標籤/搜索