`
zwnJava
  • 浏览: 208065 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

(原创)Android手动回收bitmap,引发Canvas: trying to use a recycled bitmap处理

 
阅读更多

在做Android的开发的时候,在ListView 或是 GridView中需要加载大量的图片,为了避免加载过多的图片引起OutOfMemory错误,设置了一个图片缓存列表 Map<String, SoftReference<Bitmap>> imageCache , 并对其进行维护,在图片加载到一定数量的时候,就手动回收掉之前加载图片的bitmap,此时就引起了如下错误:

 

 java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@41de4380
     at android.graphics.Canvas.throwIfRecycled(Canvas.java:1026)
     at android.graphics.Canvas.drawBitmap(Canvas.java:1127)
     at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:393)
     at android.widget.ImageView.onDraw(ImageView.java:961)
     at android.view.View.draw(View.java:13458)
     at android.view.View.draw(View.java:13342)
     at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
     at android.view.View.draw(View.java:13461)
     at android.view.View.draw(View.java:13342)

 

 

图片手动回收部分代码:

 

Bitmap removeBitmap = softReference.get();
if(removeBitmap != null && !removeBitmap.isRecycled()){
	removeBitmap.recycle(); //此句造成的以上异常
	removeBitmap = null;
}

 

网上有好多人说应该把recycle()去掉,个人认为去掉后会引起内存持续增长,虽然将bitmap设置为了null,但是系统并没有对其进行真正的回收,仍然占有内存,即是调用了System.gc() 强制回后以后,内存仍然没有下去,如果依靠内存达到上限时系统自己回收的话,个人觉得太晚了,已经对应用造成了影响,应用应该是比较卡了,所以还是赞同加上bitmap.recycle() ,但是又会引起  Canvas: trying to use a recycled bitmap 异常,困扰了很久,开始尝试从其它方面着手来解决这个问题,即然是异常就应该能够捕获到,但是在Adapter里的getView()方法里进行捕获的时候,时机晚了,没有捕获到。现在换到在ImageViewonDraw()里进行捕获,上面的异常能够捕获。

 

解决方法(继承ImageView 重写onDraw()方法,捕获异常):

在重写onDraw()方法中,其实什么都没有做,只是添加了一个异常捕获,即可捕捉到上面的错误

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.ImageView;

/**
 * 重写ImageView,避免引用已回收的bitmap异常
 * 
 * @author zwn
 * 
 */
public class MyImageView extends ImageView {

	public MyImageView (Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		try {
			super.onDraw(canvas);
		} catch (Exception e) {
			System.out
					.println("MyImageView  -> onDraw() Canvas: trying to use a recycled bitmap");
		}
	}

}

 

 

分享到:
评论
3 楼 Escalade 2018-06-08  
果然如此,这是什么原因造成的呢??为何捕获异常后就不闪退了呢??我是在RecyclerView的Adapter中第一次设置Adapter是没问题的,在重新设置就闪退了,重写onDraw方法就可以重复设置了。这是为何???
2 楼 situee 2013-10-16  
“图片手动回收” 应该要 softReference.clear(); 和 imageCache.remove(key);
另外还要检查有没有View在用这个bitmap, 否则会出Exception "trying to use a recycled bitmap"
1 楼 IT学习 2013-07-29  
这个思路不错,不过要使用到自定义控件中,最好还要把另外两个构造方法写上!
谢谢了!

相关推荐

    Android canvas drawBitmap方法详解及实例

    在Android开发中,Canvas是用于在屏幕上绘制图形和图像的核心组件。`drawBitmap()`方法是Canvas的一个关键函数,用于在Canvas上绘制Bitmap图像。本文将深入解析`drawBitmap()`方法的参数及其用法,并通过实例来说明...

    canvas 转换成bitmap

    然后,我们需要在 Activity 中编写代码来将 Canvas 转换为 Bitmap: ```java public class Test extends Activity { Canvas mCanvas; Bitmap mBitmap; public void onCreate(Bundle savedInstanceState) { ...

    Android—BitMap与Canvas学习笔记

    Android—BitMap与Canvas学习笔记

    Android下利用Bitmap切割图片

    在Android开发中,Bitmap是处理图像的基本类,用于在内存中表示位图图像。当我们需要对图片进行裁剪、缩放或进行其他操作时,Bitmap提供了丰富的功能。本篇文章将详细探讨如何在Android环境下利用Bitmap来切割图片。...

    android中对Bitmap图片设置任意角为圆角

    总的来说,Android中对Bitmap图片设置任意角为圆角涉及到了Bitmap的处理、Canvas的绘制、Matrix的旋转以及PorterDuff模式的应用等多个知识点。通过这些技术的组合使用,我们可以灵活地创造出各种定制化的图片显示...

    Android UI开发专题(五) Bitmap和Canvas实例

    在Android UI开发中,Bitmap和Canvas是两个非常重要的概念,它们是实现图形和图像处理的基础。Bitmap类代表了位图图像,而Canvas则用于在屏幕上画图,包括图像、文字和其他图形元素。在这个实例中,我们将深入理解...

    Android开发者学习笔记——View、Canvas、bitmap

    Android开发者学习笔记——View、Canvas、bitmap Android 开发者学习笔记——View、Canvas、bitmap 是 Android 开发中常用的类,本文将通过实例讲解 View、Canvas 等相关知识点。 从资源中获取位图 在 Android ...

    android 画图 bitmap drawable canvas paint

    在Android平台上,绘制图形是一项基本任务,涉及到多个关键类,如Bitmap、Drawable和Canvas,以及Paint。这些类共同构成了Android图形系统的核心,使得开发者能够创建丰富的用户界面和自定义视图。 首先,Bitmap是...

    android Bitmap用法总结

    - 获取圆角Bitmap:`getRoundedCornerBitmap`方法利用Canvas和Paint创建圆角效果。 - 生成带倒影的Bitmap:`createReflectionImageWithOrigin`方法通过复制和翻转Bitmap并添加渐变效果实现。 以上就是Android中...

    android截屏功能demo

    在Android系统中,截屏功能是一项非常常用的操作,它允许用户快速捕捉屏幕上的内容以便分享或后续处理。本文将深入探讨如何在Android平台上实现自定义的截屏功能,特别是针对标题"android截屏功能demo"所提及的支持...

    Android-使用Matrix对Bitmap进行处理

    在Android开发中,Bitmap是用于图像处理的基本对象,它存储并表示了图像的数据。而Matrix则是Android图形系统中的一个关键类,它允许我们对图像进行各种变换操作,如旋转、缩放、平移和倾斜等。这个教程将深入探讨...

    处理android bitmap oom

    在Android开发中,Bitmap对象是用于处理图像的主要类,但如果不妥善管理,它可能会引发“Out Of Memory”(OOM)错误。这是因为Android设备的内存有限,尤其是对于大型图像,加载到内存中会消耗大量资源。当应用无法...

    Android Bitmap 处理示例

    在Android开发中,Bitmap是用于表示图像数据的核心类,它在UI显示和图像处理中扮演着重要角色。然而,由于Bitmap对象通常占用大量的内存,不当的处理可能导致内存溢出(Out Of Memory)问题,因此对Bitmap进行高效...

    Android UI开发(五)Bitmap和Canvas实例.docx

    在Android UI开发中,Bitmap和Canvas是两个非常重要的概念,它们是实现自定义视图、图形绘制和图像处理的关键工具。Bitmap是Android中用于表示位图图像的数据结构,而Canvas则是一个画布,用于在屏幕上绘制这些位图...

    处理android bitmap oom 2.0版本关闭了硬件加速

    在Android开发中,Bitmap对象是用于处理图像的主要工具,但如果不妥善管理,它可能会引发一个常见的问题:Out of Memory(OOM)错误。特别是在处理大尺寸图片时,由于内存限制,系统可能无法分配足够的内存,从而...

    Android上解析24位深度Bitmap文件示例

    在Android中处理24位深度的Bitmap文件,涉及到内存管理、解码以及显示等多个环节,这里我们将详细探讨这些知识点。 1. **内存管理**:由于24位深度的Bitmap文件占用内存较大,处理不当可能导致内存溢出。Android...

    Android图片Bitmap和字符串String之间的相互转换

    在Android开发中,处理图像数据是一项常见的任务,而Bitmap和String是两个核心的数据类型,分别代表位图图像和文本字符串。Bitmap对象用于存储和显示图像,而String则常用于保存和传输文本信息。本篇文章将深入探讨...

    Android Drawable Bitmap 相互转换

    在Android开发中,Drawable和Bitmap是两种常用的图像资源类型,它们各有特点且在不同场景下有不同的优势。了解和掌握它们之间的相互转换对于优化性能和提高用户体验至关重要。本篇将详细介绍如何在Android中进行...

    处理android bitmap oom 2.0版本

    在Android开发中,Bitmap对象是用于处理图像的重要类,但如果不妥善管理,它可能会引发“Out Of Memory”(OOM)错误。这是因为Android设备的内存有限,尤其是当加载大图或大量图片时,容易超出可用内存限制。"处理...

    Android 实现把bitmap图片的某一部分的颜色改成其他颜色

    在 Android 中,我们可以使用 Bitmap 类来处理 bitmap 图片,该类提供了多种方法来处理 bitmap 图片,例如 getPixels() 方法可以获取 bitmap 图片的像素颜色值,setPixels() 方法可以设置 bitmap 图片的像素颜色值。...

Global site tag (gtag.js) - Google Analytics