当前位置: 首页 > 知识库问答 >
问题:

画布:尝试在Android2.3上使用回收的位图RuntimeException

靳茂
2023-03-14
06-27 10:57:48.420: E/AndroidRuntime(14255): FATAL EXCEPTION: main
06-27 10:57:48.420: E/AndroidRuntime(14255): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@407fc6b8
06-27 10:57:48.420: E/AndroidRuntime(14255):    at android.graphics.Canvas.throwIfRecycled(Canvas.java:955)
06-27 10:57:48.420: E/AndroidRuntime(14255):    at android.graphics.Canvas.drawBitmap(Canvas.java:1044)
06-27 10:57:48.420: E/AndroidRuntime(14255):    at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:325)
06-27 10:57:48.420: E/AndroidRuntime(14255):    at android.widget.ImageView.onDraw(ImageView.java:872)
etc etc

这是我的缓存:

 sLruCache =    new LinkedHashMap(capacity / 2, 0.75f, true) {
      private static final long serialVersionUID = -7282875042976381535L;

      @Override
      protected boolean removeEldestEntry(LinkedHashMap.Entry eldest) {
        if (size() > mCapacity) {
          return true;
        } else
          return false;
      }

      public Bitmap remove(Object key) {
        Bitmap bitmap = super.remove(key);
        if (bitmap != NULL_BITMAP) {
          bitmap.recycle();
        }
        return bitmap;
      };

      @Override
      public void clear() { 
        Set keys = new HashSet(keySet());
        for (String key : keys) {
          Bitmap map = get(key);
          if (map != NULL_BITMAP) {
            map.recycle();
          }
        }
        super.clear();
      }
    };

有什么想法为什么这会失败在Android2.3而不是4.0?

共有1个答案

巫马化
2023-03-14

我也有同样的问题。

我必须删除所有bitmap.recycle()调用。有时会导致OutOfMemoryException。

因此,我做了一个这样的黑客:

// when I need to remove bitmap from cache
if (Build.VERSION.SDK_INT < 9 || Build.VERSION.SDK_INT > 10) {
    bmp.recycle();
}   
 类似资料:
  • 问题内容: 我正在创建一个以显示图片网格。选择其中一个时,它应打开一个带有过渡的新活动。 我正在使用Glide库加载图片,并且过渡效果很糟糕,因为它在新活动中重新加载了图片。因此,我必须将其保存在缓存中,然后将其用于过渡。 我有代码,但有时如果图片未加载,则会抛出Canvas RuntimeException。 这是日志: 这是打开其他活动并将图片保存为缓存的代码: 我该怎么做才能解决此问题?提前

  • 我在片段中有一个listview。listview的每一行都有imageview,我正在加载位图图像。我将位图设置为imageview的标记。下次遇到带有非空标记的图像视图时,我会在标记中回收位图并将图像重新加载到其中。这导致崩溃“画布:试图使用回收的位图android.graphics.bitmap”在活动方向更改时崩溃。我不明白为什么会这样。请帮忙。 堆栈跟踪:java.lang.Runtim

  • 我正在使用而不是将背景、边框和/或背景色应用到页面的某个区域(主要是因为需要页面来构建,而不需要。因为我的内容可能会持续几页)。问题是,如果坐标(x=0,y=0)意味着左下角,则图像的位置不会像预期的那样。我还想将画布定位到一个固定的位置,但是似乎不起作用。请参阅附上的原始图像和要定位在{x,y,width,height}={100f,100f,200f,200f}的图像,该图像应该在页面的底部(

  • 5.2.3 在画布上绘图 本节介绍如何在画布上绘制图形。为了完整起见,我们将前面介绍过的首先需要执行的 几条语句合在一起复制如下: >>> from Tkinter import * >>> root = Tk() >>> c = Canvas(root,width=300,height=200,bg='white') >>> c.pack() 如前所述,c 是一个画布对象,而画布对象提供了若干

  • 显示网格 若要在图表画布启用网格,从菜单栏选择“图表”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“图表”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat Data Modeler 使用的默认符号样式。 简单 一个简单的符号样式。表、视图或实体

  • 显示网格 若要在图表画布启用网格,从菜单栏选择“查看”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“查看”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat Data Modeler 使用的默认符号样式。 简单 一个简单的符号样式。表、视图或实体