Android 异常:java.lang.RuntimeException:Canvas:尝试使用回收的位图

Android 异常:java.lang.RuntimeException:Canvas:尝试使用回收的位图,android,Android,基本上,我有一个主要的活动,即grid view有图像,当用户单击图像时,它会显示相应的详细活动。一切工作正常,功能正常,但它将图像保留在内存中,我正在尝试使用bitmap.recycle()释放内存基于以下内容,通过实现该方法,内存不足问题得到了一点解决。但在下面的场景中它仍然崩溃 假设用户单击图像1,然后出现详细活动,然后单击后退按钮,再次单击同一图像,然后在打开详细活动时崩溃。但如果用户点击不同的图像,它不会崩溃 图像视图初始化 @Override protected void o

基本上,我有一个主要的活动,即grid view有图像,当用户单击图像时,它会显示相应的详细活动。一切工作正常,功能正常,但它将图像保留在内存中,我正在尝试使用
bitmap.recycle()释放内存基于以下内容,通过实现该方法,内存不足问题得到了一点解决。但在下面的场景中它仍然崩溃

假设用户单击图像1,然后出现详细活动,然后单击后退按钮,再次单击同一图像,然后在打开详细活动时崩溃。但如果用户点击不同的图像,它不会崩溃

图像视图初始化

@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);
    }
按下后退按钮

@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:at-android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1084) E/AndroidRuntime:at-android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:844) E/AndroidRuntime:at-android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:490) E/AndroidRuntime:at-android.widget.ImageView.onDraw(ImageView.java:1037) E/AndroidRuntime:at-android.view.view.draw(view.java:14506)


因为当用户按下图像时,您正在循环使用位图。如果回收图像,可以将其指定为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()函数获取位图。获取位图后,可以将其设置为“图像视图”。每次您要加载图像时,此函数将加载为可变位图,您可以将其循环使用。

能否提供一些代码示例来说明?图像的来源是什么。你是从链接还是从资源获取的?我已经更新了代码,请查看更新的问题。我是从url获取图像的。我认为问题在于缓存,因为截取缓存加载了图像,而你是从缓存中回收图像。只需删除回收命令,单击图像查看内存。然后单击相同的图像,查看内存分配了更多或保持不变的值。你