因为内存使用而导致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像素大小的面积:)
与标准Android画廊的问题是,一个完整的图像质量它不会使用视图回收。你可以做任何你想要的缓存图像等。画廊本身将保留添加到画廊内存中的所有图像。这可能会导致一个快速滚动画廊,但它也会导致很多内存不足的例外。
一个很好的解决方案是使用Compatibility Library(自Api Level 4以来可用)和可在其中找到的Viewpager。它会给你一个非常可维护的画廊,更加可用(不再有图像跳跃等),如果你正在使用FragemtSatePagerAdapter,那么当前画廊中没有显示的片段可能会被破坏,如果内存变得紧张的话。
务必执行正确的碎片生命周期。这意味着:
- 片段需要一个空构造函数。
- 将片段数据保存在onSaveInstanceState中。在你的情况下,你可能想保存图像的路径。
如果你还没有使用片段,那么使用viewpager可能看起来像很多工作。但这是值得的。之后你和你的用户将拥有更好的应用程序。
Android中的SoftReferences将在内容不被硬引用的时候清除。这不是一个选项。有关更多信息,请参阅http://code.google.com/p/android/issues/detail?id=20015。 – Janusz 2012-01-30 13:17:48