2014-11-03 181 views
1

我使用LRu緩存從http協議下載和顯示圖像。我的應用程序是一個有5個片段的活動。每個片段使用圖像和文本加載自定義ListView。Android LRU緩存內存不足錯誤

我的應用程序在一段時間後總是崩潰。

這是我的logcat:

11-03 18:00:22.613:E/dalvikvm堆(1558):生成HPROF過程:com.example.example PID:1558 11-03 18: 00:24.004:E/dalvikvm(1558):無法打開/data/misc/app_oom.hprof:權限被拒絕 11-03 18:00:24.064:E/dalvikvm-heap(1558):hprofDumpHeap失敗,結果爲: -1 11-03 18:00:24.064:E/dalvikvm-heap(1558):在進程hprofDumpHeap之後 11-03 18:00:24.064:E/dalvikvm(1558):內存不足:堆大小= 196608KB ,分配= 193561KB,限制= 196608KB,程序限制= 196608KB 11-03 18:00:24.064:E/dalvikvm(1558):額外信息:足跡= 196552KB,允許的足跡= 196608KB,修剪= 12KB

這是我LRU類:

public class NBitmapCache extends LruCache<String, Bitmap> 
implements ImageCache{ 
public NBitmapCache(int maxSize) { 
    super(maxSize); 
} 

public NBitmapCache(Context ctx) { 
    this(getCacheSize(ctx)); 
} 

@Override 
protected int sizeOf(String key, Bitmap value) { 
    return value.getRowBytes() * value.getHeight(); 
} 

@Override 
public Bitmap getBitmap(String url) { 
    return get(url); 
} 

@Override 
public void putBitmap(String url, Bitmap bitmap) { 
     put(url, bitmap); 
} 

// Returns a cache size equal to approximately three screens worth of images. 
public static int getCacheSize(Context ctx) { 
    final DisplayMetrics displayMetrics = ctx.getResources(). 
      getDisplayMetrics(); 
    final int screenWidth = displayMetrics.widthPixels; 
    final int screenHeight = displayMetrics.heightPixels; 
    // 4 bytes per pixel 
    final int screenBytes = screenWidth * screenHeight * 4; 

    return screenBytes * 3; 
} 

} 

我搜索在這個論壇和谷歌如何解決這個problema,但我不完成解決這個問題。任何人都可以幫助我?我的申請的目標是從sdk 8。

在此先感謝。

+0

我覺得這是與位圖的循環 - 看'Bitmap.recycle()' – shkschneider 2014-11-03 17:13:05

+0

我不明白我怎麼能實現我的類此方法。任何人都可以幫助我? – antpr 2014-11-04 17:29:12

回答

0

嘗試計算可用於應用程序的最大內存並根據您的需要使用內存量。 你可以試試這個方法

final int maxMemory = (int)(Runtime.getRuntime().maxMemory() /1024); 
+1

我正在嘗試這個,但我有一個類似的錯誤: – antpr 2014-11-03 18:23:32