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.
- Android, veo que el montón crece, pero quiero que pare
- Diferencia entre system.gc () y runtime.gc ()
- Android: GC_FOR_MALLOC causado por un largo evento táctil?
- Gran cantidad de memoria no recogida de basura
- Otros procesos llaman a GC que ralentiza mi juego
No puedo entender por qué el lienzo está dibujando con un mapa de bits reciclado. Sucede rara vez, pero sucedió.
¿Cualquier sugerencia? ¡Gracias!
- ¿Cómo solucionar GC_concurrent liberado?
- Android - Bitmap y gestión de la memoria?
- Cómo explícitamente realizar la recolección de basura
- Memoria liberada del colector de basura de Android
- ¿Es la agrupación de objetos pequeños más eficiente que el recolector de basura Java de Android?
- ¿Cómo puedo parar el recolector de basura androide? ¿Es posible?
- Obtener la lista de procesos en ejecución y eliminar sus servicios de fondo
- Fuga de memoria de Android ClassLoader
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.
- ¿Qué debo hacer para compilar Android NDK (C ++) aps en Visual Studio 2010?
- Algunos tutoriales para OpenGL ES 2 en Android con NDK?