Używanie " onRetainCustomNonConfigurationInstance` do przechowywania danych podczas zmian konfiguracji
Od jakiegoś czasu zajmuję się programowaniem na Androida i wciąż szukam rozwiązań pozwalających zachować dane przy zmianach konfiguracji. Oprócz zapisywania Parcelable
S do Bundle
W onSaveInstanceState
docs sugerują użycie Fragment
z flagą setRetainInstance
ustawioną na true.
Ale właśnie natknąłem się na jakiś kod, który używa onRetainCustomNonConfigurationInstance
do przechowywania dowolnych obiektów (w fantazyjny sposób, ale zasadniczo dużych obiektów bez odniesień do Activity
itp.). Nigdy nie widziałem tej metody, więc mam kilka wątpliwości:
- czy ta metoda jest Bezpieczna do przechowywania dowolnych obiektów (w tym sensie, że mogę być całkiem pewien, że zostanie wywołana i że nie zostanie wycofana/usunięta w najbliższym czasie)?
- czym różni się ta metoda od
onRetainNonConfigurationInstance()
, która również powinna zwracaćObject
i w istocie powinna działać podobnie? - czy używanie zachowanego fragmentu jest z jakiegoś powodu jeszcze lepsze?
Jako bonus, byłbym wdzięczny za wszelkie inne wskazówki lub rozwiązania, aby zapisać stan obiekty takie jak AsyncTask
, Observable
, Zobacz prezenterów i dalej
1 answers
Czy ta metoda jest Bezpieczna do przechowywania dowolnych obiektów (w pewnym sensie że mogę być prawie pewien, że zostanie wezwany, i że nie będzie przestarzałe/usunięte w najbliższym czasie)?
onRetainCustomNonConfigurationInstance()
jest stosunkowo nową metodą i nie jest przestarzała. Naprawdę założyłbym, że wkrótce nie zniknie, ponieważ nie ma powodu, aby wprowadzać coś nowego tylko po to, aby to usunąć. Możesz go używać bezpiecznie.
Czym ta metoda różni się od onRetainNonConfigurationInstance(), który również powinien zwracać obiekt i w istocie powinien działać podobnie?
onRetainNonConfigurationInstance()
zawsze zwraca instancję wewnętrznej klasy NonConfigurationInstances
z zachowanymi fragmentami, Stanami loaderów itp. Nie możesz (i nie powinieneś) zmieniać tego zachowania systemu. Dlatego metoda jest final
i nie można jej zastąpić.
Jeśli chcesz zachować niestandardową instancję, musisz nadpisać onRetainCustomNonConfigurationInstance()
i zwrócić ją stamtąd.
W rzeczywistości, onRetainNonConfigurationInstance()
wywołuje onRetainCustomNonConfigurationInstance()
i zachowuje retunowaną instancję z innymi stanami, takimi jak zachowane fragmenty i loadery.
Czy używanie zachowanego fragmentu jest z jakiegoś powodu jeszcze lepsze?
Jest to raczej kwestia twojego przypadku użycia i preferencji. Logika może być taka. Jeśli Twoja aktywność kontroluje tylko fragmenty i nie ma w niej innej specjalnej logiki, łatwiej jest użyć fragmentów zachowanych. Jeśli Twoja aktywność ma coś do zachowania, możesz bezpiecznie użyć metody onRetainCustomNonConfigurationInstance()
. Jak na razie w obu przypadkach państwo nadal zostaje zachowane przez stare dobre i przestarzałe onRetainNonConfigurationInstance()
metoda.
P. S. Jeśli chodzi o bonusowe pytanie dotyczące przechowywania stanu, raczej sugeruję przyjrzeć się metodzie onSaveInstanceState () . Był przeznaczony do przechowywania Stanów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-30 18:16:01