2012-03-17 10 views
8

W mojej aplikacji znajduje się klasa, w której zadeklarowałem niektóre zmienne static. Problem polega na tym, że wartości wszystkich zmiennych nie są resetowane po zniszczeniu aplikacji.
Czy istnieje sposób na zresetowanie wartości wszystkich zmiennych statycznych, gdy aplikacja zostanie zniszczona, z wyjątkiem pojedynczego resetowania ich w onDestroy()?Usuwanie danych statycznych onDestroy()

Odpowiedz

10
class MySettings { 
    // final can't be changed 
    public static final String CONSTANT = "ucantchangeme"; 

    // static - all Objects have just these - even different Acitivities etc 
    public static String sUserName; 

    // class instance members - each Object you create with new has its own version 
    public String mUserName; 

    public MySettings() { 
     mUserName = "uninitialized"; 
    } 

    public static void init() { 
     sUserName = "Peter"; 
    } 

    public static void reset() { 
     sUserName = null; 
    } 
} 

/* Your Activity */ 
class MyActivity extends Actitivy { 
    private MySettings mSettings; 
    private MySettings mOtherSettings; 

    onCreate() { 
     // init those static parts of MySettings 
     MySettings.init(); 

     mSettings = new mSettings(); 
     mSettings.mUserName = "Peter" 
     Log.d("TAG", "Username: " + mSettings.mUserName); 
     // prints Peter 

     // this could also be another Activity 
     mOtherSettings = new MySettings(); 
     Log.d("TAG", "Username: " + mOtherSettings.mUserName); 
     // prints "uninitialized" 

     MySettings.sUserName = "Jim"; 
     Log.d("TAG", "Username: " + MySettings.sUserName); 
     // prints "Jim" 

     mSettings.sUserName = "Joe"; 
     Log.d("TAG", "Username: " + MySettings.sUserName); 
     Log.d("TAG", "Username: " + mSettings.sUserName); 
     Log.d("TAG", "Username: " + mOtherSettings.sUserName); 
     // all print "Joe" now 
    } 

    onDestroy() { 
     // clear MySettings 
     MySettings.reset(); 
    } 
} 

Można zresetować zmienne statyczne null lub dowolnej wartości chcesz, ale za pomocą zmiennych statycznych za innymi następnie stałych jest zazwyczaj zły pomysł - to zwykle źle klasy konstrukcja i może prowadzić do nieoczekiwanego zachowania takiego samego, jak obserwowane .

Wartość zmiennych statycznych będzie utrzymywać się tak długo, jak klasa jest ładowany - ma prawie nic wspólnego z cyklu działalności (onCreate, ..., onDestroy)

po raz pierwszy uzyskać dostęp do klasy z kodem zostanie załadowany, a następnie nie zniknie, dopóki nie będzie powodu, aby go wyładować. W tym czasie wszystko z twojej aplikacji (technicznie w ramach tego samego Procesu - zwykle każdy .apk używa własnego) odczyta tę samą wartość z tej statystyki.A jeśli zmienisz go z różnych miejsc, zmienisz go na inne części, które nie znają zmiany - dlatego jest źle :)

Jedyny powód (wiem o tym), że Android rozładuje klasę, to twój aplikacja zostaje całkowicie usunięta z pamięci - za pośrednictwem zabójcy zadań lub gdy aplikacja nie jest już aktywna, a pamięć jest niska. Jest to całkowicie poza kontrolą i nie powinno się zdarzyć, gdy używana jest twoja aplikacja. Może się zdarzyć, jeśli np. zadzwoni telefon, a Twoja aplikacja zostanie wznowiona później.

+0

Dokładnie to samo robię teraz, ale jest wiele zmiennych statycznych, które należy zresetować, więc zastanawiałem się, czy jest jakikolwiek lepszy lub czystszy sposób na zrobienie tego. – noob

+0

Działa tylko wtedy, gdy robisz to ręcznie, jak w 'reset()'. Jeśli masz ich dużo, prawdopodobnie mógłbyś to zrobić za pomocą [reflection] (http://java.sun.com/developer/technicalArticles/ALT/Reflection/) w pętli we wszystkich polach, ale nie zrobiłbym tego. – zapl

1

Nie jest to możliwe, zmienna statyczna musi być wyraźna, gdy aktywność ulegnie zniszczeniu. Może się zdarzyć, że twoja zmienna statyczna zostanie zadeklarowana w innej aktywności i zniszczysz inną aktywność.

Activity loses almost all the references once get destroyed. 
+0

Zmienne są zadeklarowane w oddzielnej klasie, która nie jest działaniem. Zostaną zainicjowane po uruchomieniu pierwszego działania. Ale kiedy kończę aplikację i sprawdzam wartości, zachowują tam wartość. – noob

+0

, więc musisz wyczyścić ją ręcznie. w onDestroy() of activity staticvariable = ""/null; –

4

W onDestroy() można ustawić zerowe wartości tych static variables ..

EDIT:

Static variables są tworzone i inicjowana gdy klasa zawierająca nich jest załadowany do VM przez program ładujący klasy. Gdy klasa jest rozładowana lub zakończyła się VM, zmienne statyczne mają wartość "poof". Istnieje generalnie nie ma potrzeby ich usuwania.

Przypuszczam, że jeśli chciałeś można usunąć je w OnTerminate() metody (w aplikacji) lub onDestroy() metody (w działaniu), ale nie ma sensu robić tak, i nie nie ma gwarancji, że jedna z tych dwóch metod zostanie wywołana.

Jeśli z jakiegoś powodu paranoidalną o zmiennych nie będących skasowany, gdy utworzony (poważne naruszenie „umowy” w VM), to mógł usunąć je w sposób onCreate().

0

Kiedy twoja gwiazda aktywności sprawdzi twoją zmienną. Gdy działanie zostanie zniszczone, wszystkie zmienne są inicjowane ponownie. Sprawdź swoją wartość zmiennej. Niemożliwe, gdy aktywność zostanie zniszczona, zmienna wartość jest taka sama. Sprawdź, kiedy wartość zmiennej, gdy to zainicjowano.

OR Reinicjowana zmienna w metodzie Destroy. Zmienna statyczna = "" lub zmienna statyczna = null.

+0

Zmienna statyczna nie została zainicjalizowana według instancji. Są powiązane z klasą, a nie z instancją. – Praveen

0

Po zresetowaniu zmiennych statycznych onCreate nie są już statyczne i można równie dobrze używać zmiennej niestatycznej.

W rzeczywistości najprawdopodobniej lepiej byłoby, gdyby tak się stało z powodu braku synchronizacji między określonym zmiennym statycznym zachowaniem a cyklem życia aplikacji Androida.

Powiązane problemy