因为内存使用而导致Android图库崩溃

因为内存使用而导致Android图库崩溃

问题描述:

在我的应用程序中,我们使用的是一个图库,来自android dev(http://developer.android.com/resources/tutorials/views/hello-gallery.html)。加载/ sdcard/DCIM(所有子目录)中的所有照片。尽管我们已经对所显示的图像重新采样以使用更少的内存,但如果用户有很多图片或滚动速度太快,它仍会崩溃。因为内存使用而导致Android图库崩溃

是否有任何建议如何使画廊不崩溃的应用程序?

(不得向Google已经为我们提供了一个画廊“出了自己的”,它利用所有这些问题的关心?)

你有没有使用软引用一个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

与标准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