android - 是否有必要将图像存储在内存中以在android中的 ListView 上显示

标签 android image listview memory-management drawable

我在列表的每一行上显示一个 ImageView 列表。

为此,我使用 Drawable.createFromStream 在另一个 AsyncTask 中从网络下载图像 并将它们作为 Drawable 存储在 ArrayList 中,我将其传递给扩展 BaseAdapter 类的 Adapter 类。

但图像是用高分辨率相机拍摄的,因此尺寸可能非常大。 我收到 OutOfMemory 错误。

所以我的问题:

  1. 将图像存储为可绘制图像、位图或任何其他格式,哪种更有效?

  2. 我做得对吗,将所有图像存储在内存中(在数组列表中)。也就是说,我在想,一旦获得图像,我会将其显示在 ImageView 上,而不存储在 ArrayList 中。

  3. 有什么办法可以在下载后压缩图像,这样它们就会占用更少的内存空间。

我的总代码存在 here

最佳答案

Android 文档提供了一个很好的示例,展示了如何在 Android 应用程序中处理位图。该示例使用磁盘和内存缓存并在后台加载图像。通过这样做,主 UI 线程不会因加载图像而减慢速度。

Loading Bitmaps effectively

在示例中,图像是从 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/

相关文章:

横向模式下的 Android 搜索对话框

android - 如何在靠近预定义位置时从 Android 发送短信 (SMS)

android - 在输入过程中显示字符数

android - 广告加载失败,错误代码 0(内部错误) - 华为广告实现

css - 调用转发到 JSP 的 Servlet 时,浏览器无法访问/查找相关资源,如 CSS、图像和链接

image - 从 Excel 文档中提取图像

html - 无法调整表格大小以适合表格中的图像

android - Gridview 单击在自定义 ListView 中不起作用

java - Android - 从 ListViewAdapter 中删除项目然后刷新

Android ActionBar/ActionBarSherlock 多项选择微调器