首页 文章

异常:java.lang.RuntimeException:Canvas:尝试使用循环位图

提问于
浏览
2

基本上,我有一个主要活动,即网格视图有图像,当用户点击图像时,它显示相应的详细活动 . 一切工作正常和功能,但它保持图像在内存中,我试图通过使用基于以下linkbitmap.recycle(); 释放内存,通过实现该方法,内存不足问题已经修复了一点 . 但它仍然在以下情况下崩溃 .

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

ImageView initialization

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

Back Button Pressed

@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:在android.view.View.draw(View.java:14506)

1 回答

  • 2

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

相关问题