2010-11-24 3 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) 

ich eine Bild-Cache mit Softreference implementiert und eine Image mit einem Bitmap aus dem Bild Cache eingestellt.Leinwand: Der Versuch, eine Recycling-Bitmap verwenden android.graphics.Bitmap

Ich benutze Bitmap.recycle() nicht und überprüfe die Bitmap.isRcycled() vor der Einstellung der Bitmap zu einem ImageView.

Ich kann nicht herausfinden, warum die Leinwand mit einer recycelten Bitmap zeichnet. Es passiert selten, aber es ist passiert.

Irgendwelche Vorschläge? Danke!

+0

Bitte überprüfen Sie die Lösung, die ich in einem anderen Thread gegeben habe. http://stackoverflow.com/questions/6791742/android-trying-to-use-a-recycled-bitmap-not-in-my-code/7937945#7937945 – Abilash

+0

Diese Lösung funktionierte für mich: http: // Stackoverflow. com/a/7984324/242769 – aryaxt

Antwort

0

Das gleiche Problem, aber jetzt habe ich es gelöst. Versuchen Sie, diese Weise, wenn ein png oder andere neu zu laden:

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

Ich muss wissen, wenn die png1 recycelt wurde, wenn nicht, können Sie auch versuchen, die Runtime Ausnahme fangen.

0

Sie sollten nicht dieselben Bildressourcen für verschiedene Aktivitäten verwenden, während einer von ihnen seine Bitmap recycelt.

Wenn Sie diese Situation haben, hat die Bildressource einer dieser Aktivitäten geändert.

4

Wenn jemand jemals hier bekommt und kämpft um herauszufinden, welche Bitmap zurückgeführt wird (wie ich), dann ist hier, was ich dies zu tun am Ende zu beheben:
1) I ein globales Thread.setDefaultUncaughtExceptionHandler gelegt, die die Heap-Dumps (Ich hatte es tatsächlich bereits eingerichtet, um OOM-Fehler zu diagnostizieren). Der Code innerhalb des Handlers ist dies:

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) this große Artikel verwenden, können Sie lernen, wie man dann bis laden und die Hprof Dump-Datei MAT mit analysieren.

3) Innerhalb der MAT, ich gefiltert Klassen zuerst von "Bitmap" regex, und dann nach der Bitmap-Referenz-ID (in OP-Fall: "4384c218"). Dies wird Ihnen eine ziemlich gute Idee geben, welche Ansicht diese recycelte Bitmap enthält und Sie können anfangen, über die Lösung dafür nachzudenken. (In meinem Fall habe ich Bilder aus einem gemeinsamen Cache recycelt, einige davon waren Zeichnungsdateien, die auch in XML-Layouts verwendet wurden und bis OnDestroy im Cache gespeichert sein sollten).