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

Author: wasyl, 2015-06-05

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.

 14
Author: sergej shafarenka,
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