Lona: intentando usar un mapa de bits reciclado android.graphics.Bitmap

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 android.graphics.Bitmap@4384c218 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) 

Implementé un caché de imagen con SoftReference y establecer un ImageView con un mapa de bits desde el caché de imágenes.

No utilizo Bitmap.recycle () y comprobar el Bitmap.isRcycled () antes de fijar el mapa de bits a un ImageView.

No puedo entender por qué el lienzo está dibujando con un mapa de bits reciclado. Sucede rara vez, pero sucedió.

¿Cualquier sugerencia? ¡Gracias!

Si alguien llega aquí y está luchando para averiguar qué bitmap se recicla (como yo), esto es lo que terminé haciendo para solucionar esto:
1) Puse un global Thread.setDefaultUncaughtExceptionHandler que descarga la pila (en realidad ya tenía en su lugar para diagnosticar errores de OOM). El código dentro del controlador es el siguiente:

 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) Utilizando este gran artículo, puede aprender a cargar y analizar el archivo de volcado hprof utilizando MAT .

3) Dentro de la MAT, primero filtrar las clases por "bitmap" regex, y luego buscó el ID de referencia de mapa de bits (en el caso OP: "4384c218"). Esto le dará una buena idea de qué vista es la celebración de este bitmap reciclado y se puede empezar a pensar en la solución para ello. (En mi caso, estaba reciclando las imágenes de una caché común, algunas de las cuales eran drawables que también se usaban en layouts XML y deberían haber sido "clavadas" en la caché hasta OnDestroy).

No debe utilizar los mismos recursos de imagen para diferentes actividades, mientras que uno de ellos está reciclando su mapa de bits.

Si tiene esta situación, cambie el recurso de imagen de una de esas actividades.

El mismo problema, pero ahora lo he resuelto. Pruebe de esta manera cuando vuelva a cargar un png u otros:

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

Debo saber cuándo el png1 fue reciclado, si no, usted puede también intentar coger la excepción de RuntimeException.

  • java.lang.OutOfMemoryError: Límite de sobrecarga de GC superado en Android 1.4
  • Android GC - LogCat siempre muestra actividad de GC
  • Un montón de recolección de basura en un listview
  • GC_FOR_ALLOC es más "serio" al investigar el uso de la memoria?
  • Problemas con la recolección de basura y Picasso
  • Referencia débil para la llamada de red mala idea?
  • ¿Qué significan GC_FOR_MALLOC, GC_EXPLICIT y otros GC_ * en Android Logcat?
  • La interfaz de usuario de aplicación se congela con mensajes de GC
  • Multithreading de Android: WaitForGcToComplete después de enviar la aplicación al fondo
  • En una aplicación React Native JavaScript, ¿por qué cambiaría el comportamiento de Android GC si creaba una variable temporal en lugar de devolver un valor directamente?
  • LeakCanary detecta pérdida de memoria de Android WebView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.