Ja studiuje się na temat najlepszych praktyk w celu zapobiegania pamięć Kontekst/Activity przecieków podczas tworzenia widoków, a ja nie mogę znaleźć jednoznacznej odpowiedzi na to, co jest lub nie jest dozwolone, gdy przychodzi do pól statycznych na zajęciach.Android: statycznych pól i Memory Wycieki
Powiedzmy mam kod postaci:
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.
}
}
}
jestem nieco mylić na co JVM faktycznie uważa classloader dla MyInnerClass. Z technicznego punktu widzenia, ponieważ jest to obiekt SurfaceView, wydaje się, że zmienne statyczne powinny zawsze istnieć, gdy aplikacja stworzy instancję MyInnerClass jeden raz (co dzieje się, gdy widok jest najpierw zawyżony), a następnie pozostaje tam, dopóki sama aplikacja nie zostanie zakończona. Jeśli tak, to co zapobiega również otwarciu map bitmapowych i obiektów Canvas i wypełnieniu sterty?
Jedyne oświadczenie kiedykolwiek zobaczyć powtarzane w kółko, jest to, że nie może przeciekać Kontekst statyczne jak wykazałem w konstruktorze, ale nigdy nie wykracza poza to. Czy to naprawdę jedyna rzecz, której nie możesz zrobić?
twoje "płótno" itp. Nie musi być "statyczne". W ten sposób rzeczywiście pozostanie na kupce na zawsze – zapl
Jeśli tak jest, to co zapobiega stałym (tj. - prywatnemu statycznemu finałowi MY MYCONSTANT), czy też zawiera dowolną klasę, która rozszerza aktywność (i jej kontekst)? – SeaNick