【问题标题】:Exception : java.lang.RuntimeException: Canvas: trying to use a recycled bitmap异常:java.lang.RuntimeException:Canvas:尝试使用回收的位图
【发布时间】:2016-01-13 05:46:13
【问题描述】:

基本上,我有一个主要活动,即网格视图有图像,当用户单击图像时,它会显示相应的详细活动。一切工作正常且功能正常,但它将图像保存在内存中,我正在尝试使用基于以下linkbitmap.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);
    }

按下返回按钮

@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: 试图使用回收的位图 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:at android.view.View.draw(View.java:14506)

【问题讨论】:

    标签: android


    【解决方案1】:

    因为当用户按下图像时您正在回收位图。如果您回收图像,您可以将其分配为 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() 函数获取位图。获取位图后,您可以将其设置为图像视图。每次你想加载图像时,这个函数加载为可变位图,你可以回收它。

    【讨论】:

    • 能否提供一些代码示例来说明?
    • 图片来源是什么。您是从链接还是从资源中获取的
    • 我已经更新了代码,请查看更新后的问题。
    • 我从 url 获取图片。
    • 我认为问题出在缓存上,因为 volley 缓存加载了图像并且您从缓存中回收图像只需删除回收命令单击图像查看内存。之后单击相同的图像并查看内存分配更多或保持相同的值。你
    猜你喜欢
    • 2012-12-17
    • 2011-05-15
    • 1970-01-01
    • 2013-07-12
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多