没有回收位调用位图的循环错误 [英] Bitmap recycle error with no bitmap recycle call

查看:252
本文介绍了没有回收位调用位图的循环错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个图像加载到意见的适配器。它运行只是罚款时,我真的被快速向上和向下滚动列表视图测试ListView中,我得到一个画布上尝试使用回收的位图。不过,我是因为我使用的是ImageLoader的永远不会调用bitmap.recycle。该错误不给我哪里有错误发生的位置。我的猜测是,适配器自动回收其自身的位图,因为我不作手动呼叫。这个问题是不是很一致的,但我可以重新创建它,如果我真的努力。是什么原因造成这个问题,或者我怎么能找到呢?

下面是堆栈跟踪。

  11月11日至26日:01:41.131 1124年至1124年/ com.android.wallfly E / AndroidRuntime:致命异常:主要
工艺:com.android.wallfly,PID:1124
了java.lang.RuntimeException:画布:试图用一个循环位图android.graphics.Bitmap@432bc210
        在android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1084)
        在android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:844)
        在android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:496)
        在android.widget.ImageView.onDraw(ImageView.java:1058)
        在android.view.View.draw(View.java:15304)
        在android.view.View.getDisplayList(View.java:14198)
        在android.view.View.getDisplayList(View.java:14240)
        在android.view.View.draw(View.java:15018)
        在android.view.ViewGroup.drawChild(ViewGroup.java:3298)
        在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3135)
        在android.view.View.getDisplayList(View.java:14193)
        在android.view.View.getDisplayList(View.java:14240)
        在android.view.View.draw(View.java:15018)
        在android.view.ViewGroup.drawChild(ViewGroup.java:3298)
        在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3135)
        在android.view.View.draw(View.java:15307)
        在android.view.View.getDisplayList(View.java:14198)
        在android.view.View.getDisplayList(View.java:14240)
        在android.view.View.draw(View.java:15018)
        在android.view.ViewGroup.drawChild(ViewGroup.java:3298)
        在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3135)
        在android.view.View.draw(View.java:15307)
        在android.widget.FrameLayout.draw(FrameLayout.java:472)
        在android.view.View.getDisplayList(View.java:14198)
        在android.view.View.getDisplayList(View.java:14240)
        在android.view.View.draw(View.java:15018)
        在android.view.ViewGroup.drawChild(ViewGroup.java:3298)
        在android.widget.ListView.drawChild(ListView.java:3393)
        在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3135)
        在android.widget.AbsListView.dispatchDraw(AbsListView.java:2918)
        在android.widget.ListView.dispatchDraw(ListView.java:3388)
        在android.view.View.draw(View.java:15307)
        在android.widget.AbsListView.draw(AbsListView.java:5184)
        在android.view.View.getDisplayList(View.java:14198)
        在android.view.View.getDisplayList(View.java:14240)
        在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3272)
        在android.view.View.getDisplayList(View.java:14135)
        在android.view.View.getDisplayList(View.java:14240)

下面是ImageLoader的信息

  ImageLoaderConfiguration配置=新ImageLoaderConfiguration.Builder(上下文)
            .threadPriority(Thread.NORM_PRIORITY - 2)
            .denyCacheImageMultipleSizesInMemory()
            .memoryCache(新WeakMemoryCache())
            .diskCacheFileNameGenerator(新Md5FileNameGenerator())
            .tasksProcessingOrder(QueueProcessingType.LIFO)
            .writeDebugLogs()//发布的应用程序中删除
            。建立();            选项​​=新DisplayImageOptions.Builder()
                .cacheInMemory(真)
                .cacheOnDisc(真)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .resetViewBeforeLoading(真)
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
                。建立();


解决方案

您ImageLoader的显然是做一些回收。

请参阅Android试图用一个循环的位图,不是我的code 和<一个href=\"https://stackoverflow.com/questions/22129420/canvas-trying-to-use-a-recycled-bitmap-android-graphics-bitmap-in-android\">Canvas:试图用一个循环位android.graphics.Bitmap在android系统为了更好地理解这个问题。

如何修复它取决于你的实现(code)和你的ImageLoader的。
发布一些code或堆栈跟踪可能的帮助。

I have an adapter that loads images into views. It runs fine except that when I test the ListView by scrolling really fast up and down the listview, I get a "Canvas trying to use a recycled bitmap". However I never call bitmap.recycle because I am using an imageloader. The error does not give me a location of where the error is happening. My guess is that the adapter automatically recycles bitmaps on its own since I do not make a manual call. This problem is not very consistent but I can recreate it if I really try. What is causing this problem or how can I locate it?

Here is the stacktrace.

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)

Here is the ImageLoader info

        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();

解决方案

Your ImageLoader is doing some recycling obviously.

See Android trying to use a recycled bitmap, not in my code and Canvas: trying to use a recycled bitmap android.graphics.Bitmap in android for a better understanding of the problem.

How to fix it depends on your implementation (code) and your "imageloader". Posting some code or the StackTrace might help.

这篇关于没有回收位调用位图的循环错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆