Używam SharedPreferences
w mojej aplikacji na Androida. Korzystam zarówno z metody, jak commit()
i apply()
ze wspólnych preferencji. Kiedy używam AVD 2.3, nie pokazuje błędu, ale kiedy uruchamiam kod w AVD 2.1, apply()
metoda pokazuje błąd.
Jaka jest różnica między tymi dwoma? A używając tylko commit()
mogę zapisać wartość preferencji bez żadnego problemu?
android
sharedpreferences
Andro Selva
źródło
źródło
apply()
asynchronicznie wykona operacje we / wy dysku, gdycommit()
jest synchroniczny. Więc naprawdę nie powinieneś dzwonićcommit()
z wątku interfejsu użytkownika.apply()
wygrywa. Dlatego możesz używaćapply()
zamiastcommit()
bezpiecznie, jeśli upewnisz się, że aplikacja używa tylko jednego programu Preferencje wspólne.commit()
?Odpowiedzi:
apply()
został dodany w 2.3, zatwierdza bez zwracania wartości logicznej wskazującej na sukces lub porażkę.commit()
zwraca true, jeśli zapisywanie działa, w przeciwnym razie false .apply()
został dodany, gdy zespół programistów Androida zauważył, że prawie nikt nie zwrócił uwagi na wartość zwracaną, więc zastosowanie jest szybsze, ponieważ jest asynchroniczne.http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply ()
źródło
tl; dr:
commit()
zapisuje dane synchronicznie (blokując wątek, z którego jest wywoływany). Następnie informuje cię o powodzeniu operacji.apply()
planuje zapis danych asynchronicznie . Nie informuje Cię o powodzeniu operacji.apply()
i natychmiast ją przeczytasz , nowa wartość zostanie zwrócona!apply()
w pewnym momencie zadzwoniłeś i nadal się wykonuje, wszystkie wywołania docommit()
będą blokowane do czasu zakończenia wszystkich poprzednich wywołań aplikacji i bieżącego zatwierdzenia.Więcej szczegółowych informacji z SharedPreferences.Editor Documentation:
źródło
apply()
jest asynchroniczna, a oczekujące zapisy blokują przyszłe połączeniacommit()
.Występują problemy z użyciem Apply () zamiast commit (). Jak stwierdzono wcześniej w innych odpowiedziach, Apply () jest asynchroniczna. Mam problem z tym, że zmiany utworzone w preferencjach „zestawu ciągów” nigdy nie są zapisywane w pamięci trwałej.
Dzieje się tak, gdy „wymusisz zatrzymanie” programu lub w pamięci ROM zainstalowanej na moim urządzeniu z Androidem 4.1, gdy proces zostanie zabity przez system z powodu konieczności pamięci.
Polecam użyć „commit ()” zamiast „Apply ()”, jeśli chcesz, aby twoje preferencje były żywe.
źródło
Użyj Apply ().
Natychmiast zapisuje zmiany w pamięci RAM, a następnie czeka i zapisuje je w pamięci wewnętrznej (plik preferencji). Zatwierdź zapisuje zmiany synchronicznie i bezpośrednio do pliku.
źródło
commit()
jest synchroniczny,apply()
jest asynchronicznyapply()
jest nieważna.commit()
zwraca true, jeśli nowe wartości zostały pomyślnie zapisane w pamięci trwałej.apply()
gwarantuje ukończenie przed przełączeniem stanów, nie musisz się martwić cyklami życia komponentów AndroidaJeśli nie używasz wartości zwróconej z
commit()
i używaszcommit()
z głównego wątku, użyjapply()
zamiastcommit()
źródło
Docs dają dość dobre wyjaśnienie różnicy między
apply()
icommit()
:źródło
Z javadoc:
źródło
Te dwa warunki mogą nas mylić, gdy korzystamy z SharedPreference. Zasadniczo są one prawdopodobnie takie same, więc wyjaśnijmy różnice między commit () a apply ().
apply()
zatwierdza bez zwracania wartości logicznej wskazującej powodzenie lub niepowodzenie.commit(
) zwraca true, jeśli zapisywanie działa, w przeciwnym razie false.apply()
jest szybszy.commit()
jest wolniejszy.apply()
: Asynchronicznycommit()
: Synchronicznyapply()
: atomowycommit()
: atomowyapply()
: Niecommit()
: Takźródło
apply()
„szybsze” niżcommit()
? Zasadniczo reprezentują one to samo zadanie, które zostanie umieszczone w Looper wątku.commit()
umieszcza to zadanie w głównym Looper, podczas gdyapply()
przenosi je w tle, dzięki czemu główny looper jest wolny od zadania We / Wy dysku.