Я изучаю лучшие практики предотвращения утечек памяти Context/Activity при создании представлений, и я не могу найти определенного ответа на то, что есть или не разрешено, когда дело доходит до статических полей в классах.
Скажем, у меня есть код этой формы:
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.
}
}
}
Я немного смущен тем, что JVM фактически рассматривает ClassLoader для MyInnerClass. Технически, поскольку это объект SurfaceView, кажется, что статические переменные всегда должны существовать, как только приложение создало экземпляр MyInnerClass один раз (что происходит, когда представление сначала завышено), а затем остается там до тех пор, пока сам приложение не будет завершено. Если это так, то что препятствует тому, чтобы объекты Bitmaps и Canvas оставались открытыми и заполняли кучу?
Единственное утверждение, которое я когда-либо повторял снова и снова, заключается в том, что вы не можете пропустить статический контекст, как показано в конструкторе, но он никогда не выходит за рамки этого. Это действительно единственное, что вы не можете сделать?