android - programacion - La memoria no se libera después de eliminar el fragmento
manual de programacion android pdf (2)
Esto se está sumando a la respuesta de Ricardo.
Puede agregar el siguiente código para iniciar la recolección de basura en Android:
Runtime.getRuntime().gc();
Nota: Llame a esta función después de que haya anulado todas las variables locales. La ejecución de este código no garantiza que el sistema recopile basura en su aplicación, simplemente insinúa que podría ser un buen momento para hacerlo.
Lo he usado en todas mis actividades '' onDestroy()
, y siempre parece funcionar cuando quiero.
Pruébalo, podría ayudarte.
Tengo un Fragment
que tiene un RecyclerView
.
En este RecyclerView
, ocasionalmente puedo descargar y mostrar imágenes (cargadas con Glide en ImageView
.
Entonces, cuando abro el Fragment
, la memoria usada puede saltar de alrededor de 30MB a alrededor de 100MB o incluso más.
Después de que la Activity
que contiene el Fragment
finaliza, la memoria no se libera. Se mantiene igual que antes.
Comprobé la documentación de Glide y aparentemente no tenemos que preocuparnos por liberar Bitmaps
en RecyclerView
. Este es un gran problema, debido a que la aplicación a menudo falla debido a OOM.
¿Cómo debo manejar correctamente la liberación de memoria cuando se elimina Fragment
?
Editar: otra observación
Otra cosa que noté es que si termino la Activity
y luego comienzo la misma Activity
nuevamente. La memoria retrocederá por un momento y luego retrocederá hasta 100MB, lo que me lleva a pensar que la memoria se borró antes de volver a iniciar el Fragment
.
La recolección de basura a veces es un problema doloroso en Android. La mayoría de los desarrolladores no consideran este problema y simplemente continúan desarrollándose sin ningún sentido de asignación de recursos.
Esto, por supuesto, causará problemas de memoria como fugas, OOM y enlace de recursos innecesarios. No hay absolutamente ninguna manera automática de liberar memoria. No puede, bajo ninguna circunstancia, depender únicamente del recolector de basura
Siempre que pase el método Fragment''s o Activity onDestroy () , lo que puede y debe hacer es borrar cualquier construcción que ya no se requiera en la aplicación. Puedes hacer lo siguiente:
- Evita instancias anónimas de oyentes. Crea oyentes y destrúyelos cuando ya no los necesites.
- Configure a todos los oyentes (ya sea clic, clic largo, etc.) para anular
- Borre todas las variables, matrices. Aplicar el mismo procedimiento a todas las clases y subclases contenidas dentro de la Actividad / Fragmento
- Establezca la variable en nulo cada vez que realice cualquiera de los pasos anteriores en esa clase determinada (se aplica a todas las variables)
Lo que terminé haciendo fue crear una interfaz como
public interface clearMemory(){
void clearMemory();
}
e implementarlo en cada clase, ya sea Actividad, Fragmento o una clase normal (incluye adaptadores, vistas personalizadas, etc.).
Luego, llamaba al método cada vez que se destruía la clase (porque la aplicación se estaba destruyendo o cada vez que sentía la necesidad de hacerlo. Cuidado de no disponer en tiempo de ejecución normal)
@Override
public void onDestroy(){
clearMemory();
}
public void clearMemory(){
normalButtonOnClickListener = null;
normalButton.setOnClickListener(null);
normalButton = null;
myCustomClass.clearMemory(); // apply the interface to the class and clear it inside
myCustomClass = null;
simpleVariable = null;
...
}
Al implementar esto de forma sistemática, la administración de la memoria de mis aplicaciones se ha vuelto más fácil y ligera. Entonces uno puede saber / controlar exactamente cómo y cuándo se desecha la memoria.