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

标签 android

基本上,我有一个主 Activity ,它是 GridView ,有图像,当用户点击图像时,它会显示相应的详细信息 Activity 。一切正常且功能正常,但它会将图像保存在内存中,我正在尝试使用 bitmap.recycle(); 基于以下 link 释放内存,通过实现该方法,内存不足问题已得到解决。但是在下面的场景中还是会崩溃。

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

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);
    }

按下后退按钮

@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: Canvas: trying to use a recycled bitmap 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。在您可以检查图像是否为空之后。如果为 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 。每次您想加载图像时,此函数都会加载为可变位图,您可以回收它。

关于android - 异常 : java. lang.RuntimeException: Canvas :尝试使用回收位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34753887/

相关文章:

android - android-support-v7-mediarouter 中的 styles.xml 错误

Android 通知图标的颜色

java - 如何从 Firebase Firestore 检索用户电子邮件并在单击按钮时将其发送到电子邮件 Intent ?

java - 无法修复 Fragment NullPointerException 中的 Map Fragment

android - 如何从 Android 中的自定义 CameraView 捕获图像?

javascript - 我希望创建一个特定的下拉菜单(包括示例)

android - PreferenceFragment 读取/写入哪个设置文件?

android - 如何在没有黑屏的情况下处理android相机打开

android - 使用阶段的 LibGDX 屏幕转换

Android Eclipse 无法调试