Android 异常:java.lang.RuntimeException:Canvas:尝试使用回收的位图
基本上,我有一个主要的活动,即grid view有图像,当用户单击图像时,它会显示相应的详细活动。一切工作正常,功能正常,但它将图像保留在内存中,我正在尝试使用Android 异常:java.lang.RuntimeException:Canvas:尝试使用回收的位图,android,Android,基本上,我有一个主要的活动,即grid view有图像,当用户单击图像时,它会显示相应的详细活动。一切工作正常,功能正常,但它将图像保留在内存中,我正在尝试使用bitmap.recycle()释放内存基于以下内容,通过实现该方法,内存不足问题得到了一点解决。但在下面的场景中它仍然崩溃 假设用户单击图像1,然后出现详细活动,然后单击后退按钮,再次单击同一图像,然后在打开详细活动时崩溃。但如果用户点击不同的图像,它不会崩溃 图像视图初始化 @Override protected void o
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获取图像的。我认为问题在于缓存,因为截取缓存加载了图像,而你是从缓存中回收图像。只需删除回收命令,单击图像查看内存。然后单击相同的图像,查看内存分配了更多或保持不变的值。你