El modo estricto de Android detecta una violación múltiple de instancia de actividad, pero no tengo idea de por qué
Código es probablemente demasiado complejo para publicar aquí en su totalidad, pero aquí está el esquema básico: Tengo dos subclases de Activity
, cada uno de los cuales alberga un ListView
. Cada ListView
tiene un adaptador de una clase personalizada, que genera instancias de View
también de una clase personalizada. Estas listas muestran elementos de datos que se generan asincrónicamente en otro subproceso; WeakReference<>
que necesita saber a dónde enviar las actualizaciones, los objetos de datos que manipula tienen objetos WeakReference<>
que están configurados para mantener referencias a los adaptadores que muestran su contenido cuando se inicializan. Cuando se selecciona un objeto en la lista de la primera actividad, inicie la segunda actividad con una intención que le ordene buscar el elemento y mostrar su contenido. A continuación, utilizar el botón de 'atrás' para cerrar la segunda actividad y volver a la primera. Por alguna razón, cuando ejecuto esto con la comprobación de StrictMode
habilitada, siempre se bloquea después de algunas iteraciones de conmutación entre las dos actividades, quejándose de que hay demasiadas instancias de una de mis clases de Activity
.
He arreglado para que un volcado del montón sea escrito apenas antes del desplome (vea Android StrictMode y volcados del montón ). Estos volcados de montón siempre muestran que hay 1 instancia de cada una de mis dos actividades en el montón en el momento de la terminación. En primer lugar, ¿esto no es de esperar cuando recientemente he cambiado entre los dos, y si es así, ¿por qué StrictMode
queja de esto? Si no se espera, ¿cómo puedo arreglar para evitar esto? Examinando el volcado de la pila, ambos objetos son referenciados de la pila principal del hilo, sobre la cual no parezco tener cualquier grado útil de control. Cada uno también tiene una referencia de android.app.ActivityThread$ActivityClientRecord
, que también no parecen ser capaces de controlar.
- ¿Cómo averiguar la huella de memoria de mi aplicación para Android?
- ¿Por qué Android no limpia la memoria después de terminar la actividad?
- Android: consumo de memoria constante / dumpGfxInfo ()
- Pruebas de Android onTrimMemory
- Tipos de memoria de Android (RAM v Memoria interna)
Así que, básicamente, cualquier idea de cómo evitar esta situación? ¿Esto realmente representa una fuga de actividad, o es StrictMode sólo ser demasiado sensible?
- Android NDK: Dalvik Heap y Native Heap - Cómo separar entre los dos
- No existe el directorio de caché
- Gestión de la memoria android fuera del montón
- Merory Leak; Los objetos no tienen raíz de GC
- Desplazamiento de las imágenes de pantalla en la memoria
- Uso de finales estáticas en la actividad de Android
- ¿Cómo utilizar los controladores?
- pérdida de memoria debido a llamada bitmapfactory
Sé que esto es viejo poste. Sólo para chicos que está buscando solución y explicación a este problema.
En caso de que exista excepción InstanceCountViolation, significa que hay un problema real que la fuga de actividad. De lo contrario, puede haber un problema relacionado con la forma en que detecta la detección de ActivityLeaks se implementa en Android SDK.
Para identificar si este es un problema, puedo recomendar la siguiente publicación: Detectar actividades filtradas en Android . Si ves que hay objetos que contienen una referencia a esta actividad que no están relacionados con Android Framework, entonces tienes un problema que debe ser arreglado por ti.
En caso de que no exista ningún objeto que contenga una referencia a esta actividad que no esté relacionada con Android Framework, significa que se ha encontrado con el problema relacionado con cómo se implementa la detección de ActiveSecurityLeaks. En este caso para solucionar el problema con la actividad fallida sin apagar detectivesActivityLeaks, simplemente puede ejecutar System.gc () antes de iniciar la actividad en la configuración de depuración, como en el ejemplo siguiente:
if (BuildConfig.DEBUG) { System.gc(); } Intent intent = new Intent(context, SomeActivity.class); this.startActivity(intent);
Más información está disponible en esta respuesta .
- Pantalla blanca antes de la pantalla inicial
- Android: ID de publicidad o identificación exclusiva de Android