3

我需要在我的应用程序中显示许多图像。这些是 jpgs 和 pngs,我将它们加载到 ImageViews 中,如下所示:

tile.setImageResource(R.drawable.tile_highlight);

我目前遇到 OutOfMemory 问题 ( java.lang.OutOfMemoryError: bitmap size exceeds VM budget)

我搜索并发现了其他一些帖子,它们都建议您应该手动回收 ImageView 的位图,如下所示:((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();这将从内存中转储它。

但在我的情况下,因为我没有使用setBitmap()将图像加载到 ImageView 对象上,当我尝试运行上面的代码时,它返回NullPointerException,更准确地说,该方法getBitmap()返回 null,没有位图?!?!

我是否需要返回我的代码并更改我在 ImageViews 中加载所有图像的方式,然后尝试使用该recycle()方法?或者我怎样才能释放内存使其不再崩溃?

编辑

我已经尝试过类似imageView.setImageResource(-1);的方法:希望它会从内存中删除图像并将其替换为 ... null 或其他东西,但它似乎无济于事。

4

5 回答 5

4

如果您可以发布一些代码,那将会很有帮助。具体来说,您如何设置ImageView对象的图像。如果您不使用位图,我希望它getBitmap()会返回 null。但是,如果您使用另一种Drawable或其他方式来设置图像,则可能有类似的方法可以采用不涉及位图的方法。

编辑:

好吧,试一试。Bitmap您可以从这样的资源创建一个:

Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.image);

然后,像这样使用位图,考虑到 img 是你的ImageView

img.setImageBitmap(bm);
//Do some stuff with it, then when memory gets low:
((BitmapDrawable)img.getDrawable()).getBitmap().recycle();

当然,这是考虑到您正在进行一项活动。如果没有,您将必须掌握上下文并替换getResources()context.getResources().

于 2012-07-18T14:18:27.263 回答
2

如果要将图像从 drawable 设置为 ImageView,请不要ImageView.setImageResource(int resId)直接与 drawable id 一起使用。而是获取按比例缩小的位图(如果适用)并将其设置为 imageView。像这样:这对我有用。

    iv.setImageBitmap(decodeResource(getResources(), R.drawable.big_image));

    private static Bitmap decodeResource(Resources res, int id) {
        Bitmap bitmap = null;
        BitmapFactory.Options options = new BitmapFactory.Options();
        for (options.inSampleSize = 1; options.inSampleSize <= 32; options.inSampleSize++) {
            try {
                bitmap = BitmapFactory.decodeResource(res, id, options);
                Log.d(TAG_LOG, "Decoded successfully for sampleSize " + options.inSampleSize);
                break;
            } catch (OutOfMemoryError outOfMemoryError) {
                // If an OutOfMemoryError occurred, we continue with for loop and next inSampleSize value
                Log.e(TAG_LOG, "outOfMemoryError while reading file for sampleSize " + options.inSampleSize
        + " retrying with higher value");
            }
        }
        return bitmap;
    }

来源:https ://codingjunkiesforum.wordpress.com/2014/06/12/outofmemory-due-to-large-bitmap-handling-in-android/

于 2015-11-15T05:42:15.030 回答
1

尝试

((BitmapDrawable)im.getBackground()).getBitmap().recycle();
于 2012-07-18T14:30:42.717 回答
1

我认为您应该显示分辨率较低的图像。这将解决 OOM 问题。您还可以阅读 Android 开发者指南链接

于 2016-04-18T06:54:13.873 回答
1

OutOfMemory 错误发生在您在使用位图后不释放位图(可能是大尺寸),因此为防止这种情况发生,我们应该记住重新调整大小、采用弱引用等,但是有很好的库可以解决所有问题之一他们是毕加索。请看一下-

使用毕加索加载图像

于 2016-04-18T08:17:28.080 回答