He estado estudiando las mejores prácticas para evitar fugas de memoria de contexto/actividad al crear vistas, y parece que no puedo encontrar una respuesta definitiva sobre lo que está o no permitido cuando llega a los campos estáticos en las clases.Android: campos estáticos y fugas de memoria
Digamos que tengo un código de esta forma:
public class MyOuterClass extends Activity{
private MyInnerClass;
MyInnerClass = (MyInnerClass) findViewById(<XML call here>);
MyInnerClass.myXInt = 3;
// onCreate(), onResume(), etc.
public static class MyInnerClass extends SurfaceView implements Runnable{
// Safe variables?
private static int myXInt, myYInt;
private static boolean myBoolean;
// Potentially safe?
private static Canvas myCanvas;
// Definitely bad.
private static Context myContext;
public MyInnerClass(Context context){
myContext = context; // This is bad.
}
}
}
Estoy un poco confundido sobre lo que la JVM en realidad considera que el cargador de clases para MyInnerClass. Técnicamente, dado que es un objeto SurfaceView, parece que las variables estáticas siempre deben existir una vez que la aplicación ha instanciado MyInnerClass una vez (lo que sucede cuando la vista se infló por primera vez), y luego permanecer allí hasta que la aplicación se termine. Si ese es el caso, ¿qué impide que los objetos Bitmaps y Canvas permanezcan abiertos y llenen el montón?
La única afirmación que veo repetida una y otra vez es que no se puede filtrar Contexto estático como el que he mostrado en el constructor, pero nunca va más allá. ¿Es eso realmente lo único que no puedes hacer?
su 'Lienzo' etc. no necesita ser' estático'. De esa forma, de hecho permanecería en el montón para siempre – zapl
Si ese es el caso, entonces ¿qué impide las constantes (es decir, privada estática final int MY_CONSTANT), desde también mantener abierta cualquier clase que amplíe la actividad (y su contexto)? – SeaNick