2010-07-27 9 views
25

He leído que es un error y una fuente de pérdida de memoria en la aplicación de Android para mantener una referencia de larga duración a un contexto.Android: referencias a un contexto y fugas de memoria

Pero no entiendo si es buena idea crear una clase que se parece a éste:

public class HelperClass { 
    private Context context; 

    public HelperClass(Context context) { 
     this.context = context; 
    } 
    public void myHelperMethod() { 
     // uses this.context 
    } 
} 

Y llamaremos a partir de una actividad:

public class MyActivity extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
     HelperClass h = new HelperClass(this); 
     h.myHelperMethod(); 
    } 

    ... 
} 

Respuesta

43

Esto está muy bien, y no causará una pérdida de memoria.

Tan pronto como onCreate termina de ejecutarse, estará fuera del alcance y será elegible para la recogida de basura. Si h fuera estático, entonces podría tener problemas. Solo cuando la referencia al contexto sobreviva al ciclo de vida del contexto en sí, se producirá una pérdida de memoria. Algunos consejos útiles:

  • Use Context.getApplicationContext() cuando sea posible. Este contexto vivirá mientras tu aplicación esté activa.
  • Tenga cuidado al usar campos estáticos y clases internas.
  • Run your application through a profiler para comprobar si hay fugas.
+1

¿Qué pasa si tienes una variable privada con una clase de ayuda en tu actividad que tenga una referencia 'Context'? – Peterdk

+2

@Peterdk si su variable contiene Instancia de contexto de getApplicationContext(), no hay problema. Pero si mantiene Contexto de una Actividad, tenga cuidado con las pérdidas de memoria (más correctamente manteniendo la instancia de Actividades más de lo necesario). Tal vez deberías usar una WeakReference para mantener la instancia de contexto de Actividad y usar un oyente para saber cuándo tu aplicación ha cambiado a otra actividad. – marciowb

6

El alcance de HelperClass está solo dentro de su función onCreate, por lo que una vez que se ejecuta Create, su "h" ya no es necesario y está sujeto a la recolección de elementos no utilizados.

Sería una historia diferente si "h" fuera un miembro estático: ESA sería una gran manera de perder memoria.

Cuestiones relacionadas