2010-11-24 23 views
5
11-24 23:19:18.434: ERROR/AndroidRuntime(12660): Uncaught handler: thread main exiting due to uncaught exception 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected] 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.graphics.Canvas.throwIfRecycled(Canvas.java:955) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.graphics.Canvas.drawBitmap(Canvas.java:1044) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:291) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.widget.ImageView.onDraw(ImageView.java:908) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.View.draw(View.java:6283) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.drawChild(ViewGroup.java:1581) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1311) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.drawChild(ViewGroup.java:1579) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1311) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.View.draw(View.java:6286) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.drawChild(ViewGroup.java:1581) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1311) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.widget.AbsListView.dispatchDraw(AbsListView.java:1323) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.widget.ListView.dispatchDraw(ListView.java:2933) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.View.draw(View.java:6389) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at   android.widget.AbsListView.draw(AbsListView.java:2142) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.drawChild(ViewGroup.java:1581) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1311) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.drawChild(ViewGroup.java:1579) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1311) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at  android.view.View.draw(View.java:6286) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.drawChild(ViewGroup.java:1581) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1311) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.View.draw(View.java:6286) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewGroup.drawChild(ViewGroup.java:1581) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at  android.view.ViewGroup.dispatchDraw(ViewGroup.java:1311) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.View.draw(View.java:6286) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1928) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewRoot.draw(ViewRoot.java:1454) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1174) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1774) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.os.Looper.loop(Looper.java:123) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at android.app.ActivityThread.main(ActivityThread.java:4321) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at java.lang.reflect.Method.invoke(Method.java:521) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
11-24 23:19:18.684: ERROR/AndroidRuntime(12660):  at dalvik.system.NativeStart.main(Native Method) 

I mis en oeuvre un cache d'image avec SoftReference et définir une ImageView avec un bitmap à partir du cache d'image.Toile d'essayer d'utiliser un bitmap recyclé android.graphics.Bitmap

Je n'utilise pas Bitmap.recycle() et vérifie le Bitmap.isRcycled() avant de définir le bitmap pour un ImageView.

Je n'arrive pas à comprendre pourquoi la toile dessine avec un bitmap recyclé. Cela arrive rarement mais c'est arrivé.

Une suggestion? Merci!

+0

Veuillez vérifier la solution que j'ai donnée dans un autre fil. http://stackoverflow.com/questions/6791742/android-trying-to-use-a-recycled-bitmap-not-in-my-code/7937945#7937945 – Abilash

+0

Cette solution a fonctionné pour moi: http: // stackoverflow. com/a/7984324/242769 – aryaxt

Répondre

0

Le même problème, mais maintenant je l'ai résolu. Essayez de cette façon quand recharger un ou .png autres:

BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.png1)); 

Je dois savoir quand le png1 a été recyclé, sinon, vous pouvez aussi essayer attraper l'exception RuntimeException.

0

Vous ne devez pas utiliser les mêmes ressources d'image pour différentes activités pendant que l'une d'entre elles est en train de recycler son bitmap.

Si vous avez cette situation, vous avez modifié la ressource d'image de l'une de ces activités.

4

Si quelqu'un arrive jamais ici et a du mal à comprendre qui Bitmap est recyclé (comme je l'ai fait), voici ce que je fini par faire pour résoudre ce:
1) Je mis une Thread.setDefaultUncaughtExceptionHandler globale qui décharge le tas (Je l'avais déjà en place pour diagnostiquer les erreurs d'OOM). Le code dans le gestionnaire est le suivant:

File f = new File(Environment.getExternalStorageDirectory(),"oom-error.hprof"); 
String path = f.getAbsolutePath(); 
// force a few GC before dumping stuff 
System.gc(); 
System.gc();  
Debug.dumpHprofData(path); 

2) En utilisant this grand article, vous pouvez apprendre comment puis charger et analyser le fichier de vidage de hprof en utilisant MAT.

3) À l'intérieur du MAT, j'ai d'abord filtré les classes par regex "Bitmap", puis j'ai recherché l'identifiant de référence Bitmap (dans OP case: "4384c218"). Cela vous donnera une bonne idée de la vue qui contient cette bitmap recyclée et vous pouvez commencer à penser à la solution pour cela. (Dans mon cas, je recyclais des images à partir d'un cache commun, dont certaines étaient des tirages qui étaient également utilisés dans des mises en page XML et qui devaient être "épinglés" dans le cache jusqu'à OnDestroy).