細節決定成敗----Android應用程序的優化(二)

本文章主要從軟引用和弱引用的角度探討Bitmap的內存優化。 java

Java從JDK1.2以後就將對象的引用分爲4個級別:強引用、軟引用、弱引用、虛引用。具體的概念不詳述了。 緩存

軟引用:當內存空間足夠的時候,GC就不會回收它,內存空間不足了,就會回收。 優化

弱引用:GC工做過程當中,一旦發現了弱引用對象,無論內存足夠與否,都會回收它的內存。 spa

因此,從上述能夠看出,軟引用和弱引用的根本區別在於:只具備弱引用的對象擁有更短暫的生命週期,可能隨時被回收。 code

當緩存大量的Bitmap時,比較容易形成OOM,因此能夠考慮使用軟引用技術來避免這個問題的發生。 對象

//首先定義一個HashMap,保存軟引用對象
private Map<string, SoftReference<Bitmap>> imageCache = 
   new HashMap<String, SoftReference<Bitmap>>();
//保存Bitmap的軟引用到HashMap
public void addBitmapToCache(String path) {
   //強引用的Bitmap對象
  Bitmap bitmap = BitmapFactory.decodeFile(path);
  //軟引用的Bitmap對象
  SoftReference<Bitmap> softBitmap = 
   new SoftReference<Bitmap>(bitmap);
  //添加該對象到map中使其緩存
   imageCache.add(path, softBitmap);
}

//獲取緩存對象
public Bitmap getBitmapByPath(String path) {
  //從緩存中取軟引用的Bitmap對象
  SoftReference<Bitmap> softBitmap = imageCache.get(path);
  //判斷是否存在軟引用
  if(softBitmap == null) {
    return null;
  }
//取出Bitmap對象,若是內存不足Bitmap被回收,將取得空
  Bitmap bitmap = softBitmap.get();
  return bitmap;
}

使用軟引用以後,在OOM異常發生以前,這些緩存的圖片資源空間都會被釋放掉,從而能夠避免程序由於OOM而Crash。 生命週期

何時使用軟引用,何時使用弱引用? 圖片

建議:若是隻想避免OOM,則使用軟引用;若是該對象常常被使用,則使用軟引用;若是想盡快回收一些佔用內存比較大的對象,則使用弱引用; 內存

百度重口電影吧第一資源論壇-豚鼠灣www.tunshus.com

相關文章
相關標籤/搜索