在我的应用程序中,我们使用了一个照片库,取自android dev(http://developer.android.com/resources/tutorials/views/hello-gallery.html)。它从/ sdcard加载所有照片/ DCIM(所有子目录)。虽然我们已经使它重新采样所显示的图像以使用更少的内存,但如果用户有很多图片或滚动太快,它仍会崩溃。
有关于如何使图库不会使应用程序崩溃的任何建议吗?
(谷歌不应该为我们提供一个“自我解决”所有这些问题的画廊吗?)
答案 0 :(得分:1)
标准android库的问题在于它不会使用视图回收。您可以执行任何您想要的缓存图像等。图库本身将保留添加到内存库中的所有图像视图。这可能会导致快速滚动图库,但它也会导致大量的内存不足异常。
一个很好的解决方案是使用Compatibility Library(自Api Level 4以来可用)和可在其中找到的Viewpager。它将为您提供一个非常易于维护的画廊(更多可用于跳转图像等)。如果您使用的是FragemtSatePagerAdapter,那么当前未在画廊中显示的片段可能会被破坏,如果内存获得紧。
确保正确实现片段的生命周期。这意味着:
如果你还没有使用碎片,那么使用viewpager可能看起来很多工作。但这是值得的。之后,您和您的用户将拥有更好的应用程序。
答案 1 :(得分:-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;
}
哦,另一个编辑:您还可以降低图像的质量,在20x20像素大小的区域不需要全画质图像:)