2011-02-15 7 views

Respuesta

36

¿Pueden esas clases internas también causar pérdidas de memoria?

Posiblemente. Depende de en qué estén registrados esos oyentes.

Por ejemplo, un bien escrito OnClickListener para un Button no debe dar lugar a una pérdida de memoria, porque a pesar de la OnClickListener puede haber una clase interna y tienen una referencia implícita a la Activity, todo el conjunto de objetos están a sólo vinculado a la actividad. Por lo tanto, cuando se destruye la actividad, la actividad, Button y OnClickListener, se puede recoger como basura en su totalidad.

Sin embargo, un LocationListener, registrado con el servicio de sistema LocationManager, se mantiene en el proceso. Por lo tanto, incluso si la actividad se destruye, el oyente permanecerá registrado. Si ese oyente es una clase interna, continuará manteniendo una referencia implícita a la actividad, y tendrá una pérdida de memoria.

¿Debería esa clase interna ser Staic one?

Posiblemente. En la mayoría de los casos, la respuesta correcta es "si está registrando un oyente que no sea con la IU, asegúrese de anular el registro en un punto apropiado". En ese caso, no habrá fugas.

¿Puede alguien darme algún código de ejemplo de cómo el oyente de eventos puede usar a prueba de fugas?

No en el resumen, no.

+0

Aquí hay un simple oyente que causa pérdida de memoria http://stackoverflow.com/questions/7083441/android-alertdialog-causes-a-memory-leak – user4o01

+0

¿Cómo puedo saber si el oyente está vinculado a la actividad o retenido? por el proceso? – Jaskey

+0

@CommonsWare gracias de nuevo Sir Murphy. –

Cuestiones relacionadas