异常:java.lang.RuntimeException:画布:尝试使用已回收的位图

3
基本上,我有一个主活动,其中网格视图具有图像,当用户点击图像时,它会显示相应的详细信息活动。一切都正常和功能性,但它会保留内存中的图像,并且我正在尝试通过使用bitmap.recycle();来释放内存,基于以下链接,通过实现该方法,内存不足问题已经得到了一些修复。但是,在以下情况下仍然会崩溃。

假设用户单击图像1,然后详细信息活动出现,然后单击“返回”按钮并再次单击相同的图像,则在打开详细信息活动时会崩溃。但是,如果用户单击不同的图像,则不会崩溃。

ImageView初始化

@Override
    protected void onResume() {
        super.onResume();
        productImageView = (NetworkImageView) findViewById(R.id.detailImage);
        ImageLoader imageLoader = CustomVolleyRequest.getInstance(this.getApplicationContext())
                    .getImageLoader();
        imageLoader.get(url, ImageLoader.getImageListener(productImageView,
                    R.drawable.image, android.R.drawable
                            .ic_dialog_alert));
        productImageView.setImageUrl(url, imageLoader);
    }

返回按钮被按下

(涉及IT技术)
@Override
    public void onBackPressed() {
        Intent intent = new Intent(ProductDetailActivity.this,MainActivity.class);
        ProductDetailActivity.this.startActivity(intent);
        this.finish();
        return;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        Drawable drawable = productImageView.getDrawable();

        if (drawable instanceof BitmapDrawable) {
            BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
            Bitmap bitmap = bitmapDrawable.getBitmap();
            if (bitmap != null && !bitmap.isRecycled()) {
                bitmap.recycle();
                bitmap = null;
            }
        }
        System.gc();
    }

这里是崩溃报告。

java.lang.RuntimeException: 画布:尝试使用已回收的位图 android.graphics.Bitmap@42524248 E/AndroidRuntime: 在 android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1084) E/AndroidRuntime: 在 android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:844) E/AndroidRuntime: 在 android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:490) E/AndroidRuntime: 在 android.widget.ImageView.onDraw(ImageView.java:1037) E/AndroidRuntime: 在 android.view.View.draw(View.java:14506)

1个回答

2

当用户按下图片时,您正在回收位图。如果您回收该图像,则可以将其分配为null。之后,您可以检查图像是否为null。如果它为null,则应重新初始化。

更新:

 imageLoader.get(newsItem.getThumbUrl(), new ImageLoader.ImageListener() {
        @Override
        public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {

        }

        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

使用以下代码获取位图,将其存储为全局变量并回收全局位图。您可以使用response.getBitmap()函数获取位图。获取位图后,您可以将其设置为ImageView。每次要加载图像时,此函数将作为可变位图加载,并且您可以对其进行回收。

使用此代码获取位图,将其存储为全局变量并回收全局位图。您可以使用 response.getBitmap() 函数获取位图。获取位图后,您可以将其设置到 ImageView 上。每次需要加载图像时,此函数将作为可变位图加载,并且您可以回收它。

请您能否提供一些代码示例来说明? - casillas
图片的来源是什么?你是从链接获取还是从资源中获取? - kgnzpk
我已经更新了代码,请查看更新后的问题。 - casillas
我正在从 URL 获取图像。 - casillas
1
我认为问题在于缓存,因为Volley缓存加载了图像,而您正在从缓存中回收图像,只需删除回收命令,点击图像查看内存。之后再次点击相同的图像并查看内存分配是否增加或保持相同值。 - kgnzpk
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接