【问题标题】:Bitmap recycle error with no bitmap recycle call位图回收错误,没有位图回收调用
【发布时间】:2014-11-26 17:14:04
【问题描述】:

我有一个将图像加载到视图中的适配器。它运行良好,除了当我通过快速上下滚动列表视图来测试 ListView 时,我得到一个“Canvas 试图使用回收的位图”。但是我从不调用 bitmap.recycle,因为我使用的是图像加载器。该错误没有给我一个错误发生的位置。我的猜测是适配器会自动回收位图,因为我没有手动调用。这个问题不是很一致,但如果我真的尝试,我可以重新创建它。是什么导致了这个问题或者我该如何找到它?

这是堆栈跟踪。

11-26 11:01:41.131    1124-1124/com.android.wallfly E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.android.wallfly, PID: 1124
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@432bc210
        at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1084)
        at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:844)
        at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:496)
        at android.widget.ImageView.onDraw(ImageView.java:1058)
        at android.view.View.draw(View.java:15304)
        at android.view.View.getDisplayList(View.java:14198)
        at android.view.View.getDisplayList(View.java:14240)
        at android.view.View.draw(View.java:15018)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3298)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3135)
        at android.view.View.getDisplayList(View.java:14193)
        at android.view.View.getDisplayList(View.java:14240)
        at android.view.View.draw(View.java:15018)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3298)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3135)
        at android.view.View.draw(View.java:15307)
        at android.view.View.getDisplayList(View.java:14198)
        at android.view.View.getDisplayList(View.java:14240)
        at android.view.View.draw(View.java:15018)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3298)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3135)
        at android.view.View.draw(View.java:15307)
        at android.widget.FrameLayout.draw(FrameLayout.java:472)
        at android.view.View.getDisplayList(View.java:14198)
        at android.view.View.getDisplayList(View.java:14240)
        at android.view.View.draw(View.java:15018)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3298)
        at android.widget.ListView.drawChild(ListView.java:3393)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3135)
        at android.widget.AbsListView.dispatchDraw(AbsListView.java:2918)
        at android.widget.ListView.dispatchDraw(ListView.java:3388)
        at android.view.View.draw(View.java:15307)
        at android.widget.AbsListView.draw(AbsListView.java:5184)
        at android.view.View.getDisplayList(View.java:14198)
        at android.view.View.getDisplayList(View.java:14240)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3272)
        at android.view.View.getDisplayList(View.java:14135)
        at android.view.View.getDisplayList(View.java:14240)

这是 ImageLoader 信息

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
            .threadPriority(Thread.NORM_PRIORITY - 2)
            .denyCacheImageMultipleSizesInMemory()
            .memoryCache(new WeakMemoryCache())
            .diskCacheFileNameGenerator(new Md5FileNameGenerator())
            .tasksProcessingOrder(QueueProcessingType.LIFO)
            .writeDebugLogs() // Remove for release app
            .build();

            options = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .cacheOnDisc(true)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .resetViewBeforeLoading(true)
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
                .build();

【问题讨论】:

标签: android bitmap


【解决方案1】:

你的 ImageLoader 显然在做一些回收。

请参阅 Android trying to use a recycled bitmap, not in my codeCanvas: trying to use a recycled bitmap android.graphics.Bitmap in android 以更好地了解问题。

如何修复它取决于您的实现(代码)和“图像加载器”。 发布一些代码或 StackTrace 可能会有所帮助。

【讨论】:

  • 我猜这与你所说的我的图像加载器有关。我已经发布了配置和选项。我怀疑“加载前重置视图”。但是我不确定。
  • resetViewBeforeLoading() 似乎会导致一些错误。尝试使用选项(包括删除resetViewBeforeLoading())。见github.com/nostra13/Android-Universal-Image-Loader/issues/362抱歉帮不上忙
【解决方案2】:

请删除

bitmap.recycle();

来自您的代码。它会解决你的错误。

【讨论】:

  • 欢迎来到 Stack Overflow。解释为什么删除 bitmap.recycle(); 可以解决问题可能会有所帮助。谢谢。
猜你喜欢
  • 2015-06-21
  • 2015-07-18
  • 2012-07-10
  • 2011-12-22
  • 2011-03-03
  • 1970-01-01
  • 2011-12-20
  • 2012-07-20
相关资源
最近更新 更多