2012-01-30 58 views
3

在我的應用程序中,我們使用的是一個圖庫,來自android dev(http://developer.android.com/resources/tutorials/views/hello-gallery.html)。加載/ sdcard/DCIM(所有子目錄)中的所有照片。儘管我們已經對所顯示的圖像重新採樣以使用更少的內存,但如果用戶有很多圖片或滾動速度太快,它仍會崩潰。因爲內存使用而導致Android圖庫崩潰

是否有任何建議如何使畫廊不崩潰的應用程序?

(不得向Google已經爲我們提供了一個畫廊「出了自己的」,它利用所有這些問題的關心?)

回答

-1

你有沒有使用軟引用一個HashMap的所有圖像,並加載它們認爲按需提供,如果不可用? SD卡上可用的內存中有大量圖像是沒有意義的。

private static final ConcurrentHashMap <String, SoftReference<Bitmap>> sBitmapCache = 
    new ConcurrentHashMap <String, SoftReference<Bitmap>>(); 

public static Bitmap getBitmapCache(String imageUrl) { 
    SoftReference<Bitmap> reference = sBitmapCache.get(imageUrl); 
    Bitmap bitmap = null; 
    if(reference != null) { 
     bitmap = reference.get(); 
    } else { 
    // get from SD 
    } 

    return bitmap; 
} 

哦另一個編輯:您還可以縮放圖像質量下降,你並不需要在20×20像素大小的面積:)

+0

Android中的SoftReferences將在內容不被硬引用的時候清除。這不是一個選項。有關更多信息,請參閱http://code.google.com/p/android/issues/detail?id=20015。 – Janusz 2012-01-30 13:17:48

1

與標準Android畫廊的問題是,一個完整的圖像質量它不會使用視圖回收。你可以做任何你想要的緩存圖像等。畫廊本身將保留添加到畫廊內存中的所有圖像。這可能會導致一個快速滾動畫廊,但它也會導致很多內存不足的例外。

一個很好的解決方案是使用Compatibility Library(自Api Level 4以來可用)和可在其中找到的Viewpager。它會給你一個非常可維護的畫廊,更加可用(不再有圖像跳躍等),如果你正在使用FragemtSatePagerAdapter,那麼當前畫廊中沒有顯示的片段可能會被破壞,如果內存變得緊張的話。

務必執行正確的碎片生命週期。這意味着:

  • 片段需要一個空構造函數。
  • 將片段數據保存在onSaveInstanceState中。在你的情況下,你可能想保存圖像的路徑。

如果你還沒有使用片段,那麼使用viewpager可能看起來像很多工作。但這是值得的。之後你和你的用戶將擁有更好的應用程序。

+0

我的應用程序需要min api 7.我能使用它嗎?我沒有使用片段,因爲該應用是用於手機而不是平板電腦。 – Panos 2012-01-30 13:32:13

+0

您可以使用兼容性庫來使用viewpager。這使得Android 1.6以上的Viewpager可用。 – Janusz 2012-01-30 13:38:42