我在列表的每一行上显示一个 ImageView
列表。
为此,我使用 Drawable.createFromStream
在另一个 AsyncTask 中从网络下载图像
并将它们作为 Drawable 存储在 ArrayList
中,我将其传递给扩展 BaseAdapter 类的 Adapter 类。
但图像是用高分辨率相机拍摄的,因此尺寸可能非常大。
我收到 OutOfMemory
错误。
所以我的问题:
将图像存储为可绘制图像、位图或任何其他格式,哪种更有效?
我做得对吗,将所有图像存储在内存中(在数组列表中)。也就是说,我在想,一旦获得图像,我会将其显示在 ImageView 上,而不存储在 ArrayList 中。
有什么办法可以在下载后压缩图像,这样它们就会占用更少的内存空间。
我的总代码存在 here
最佳答案
Android 文档提供了一个很好的示例,展示了如何在 Android 应用程序中处理位图。该示例使用磁盘和内存缓存并在后台加载图像。通过这样做,主 UI 线程不会因加载图像而减慢速度。
在示例中,图像是从 picasa 加载的。然而,修改该示例很容易,以便使用本地存储的图片。您只需编写自己的从“ImageResizer”扩展的 ImageLoader:
public class ImageLoader extends ImageResizer {
public ImageLoader(Context context, int imageWidth, int imageHeight) {
super(context, imageWidth, imageHeight);
}
public ImageLoader(Context context, int imageSize) {
super(context, imageSize);
}
@Override
protected Bitmap processBitmap(Object data) {
return decodeSampledBitmapFromFile((String)data, imageWidth, imageHeight);
}
}
但是直接回答你的问题:可以将图像加载为位图。但是您必须使用缓存和弱引用,以便在图像在屏幕上不可见的情况下可以对图像进行垃圾收集。缓存它们并使用后台任务进行加载可以实现流畅的 UI。
关于android - 是否有必要将图像存储在内存中以在android中的 ListView 上显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14273783/