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
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.
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.
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
, więc musisz wyczyścić ją ręcznie. w onDestroy() of activity staticvariable = ""/null; –
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()
.
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.
Zmienna statyczna nie została zainicjalizowana według instancji. Są powiązane z klasą, a nie z instancją. – Praveen
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.
- 1. Początkujący Android: onDestroy
- 2. onDestroy() podczas "czekania" na onActivityResult()
- 3. Usuwanie danych z LocalStorage
- 4. Activity OnDestroy nigdy nie dzwonił?
- 5. Android: stopService() nie wywołuje onDestroy()!
- 6. Android: kiedy wyrejestrować odbiorcę - onStop() lub onDestroy()
- 7. zestaw danych statycznych dla komórek UITableView
- 8. Usuwanie danych z pliku HDF5
- 9. Usuwanie danych z tabel zależnych
- 10. Usuwanie lub usuwanie starych danych z elastycznego wyszukiwania
- 11. zasoby kin w OnPause zamiast onDestroy
- 12. Aktywność Android onDestroy() wywołana na blokadzie ekranu
- 13. Usuwanie wpisu z prostokątnym
- 14. Inicjowanie Order statycznych pól statycznych klasy
- 15. Usuwanie znaków spoza ASCII z plików danych
- 16. Usuwanie najstarszych rekordów z bazy danych
- 17. Usuwanie ogromnych ilości danych z ogromnego stołu
- 18. Usuwanie danych z zagnieżdżonych obiektów bez mutowania
- 19. Usuwanie encji html z baz danych
- 20. Adnotacja danych rdzenia - Naprawa brakująca Usuwanie propagacji
- 21. Usuwanie danych z tabeli DynamoDb automatycznie
- 22. Usuwanie pustych wierszy pliku danych w R
- 23. Usuwanie bazy danych po usunięciu Konta
- 24. Usuwanie kolumny nie zmniejsza rozmiaru bazy danych
- 25. Usuwanie duplikatów w przepływie danych SSIS
- 26. Dodawanie/usuwanie elementów danych z parametrami szablonu?
- 27. Usuwanie wierszy podczas czytania D3 danych
- 28. Usuwanie obiektów/danych z obszaru roboczego
- 29. Statyczne potwierdzenie do sprawdzenia elementów danych statycznych klasy const?
- 30. Używanie klasy do przechowywania statycznych danych w Javie?
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
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