Wiele lat temu wpadłem na problem w jednej z moich aplikacji, gdy próbowałem wykonać polecenie FragmentTransaction
w moim oddzwonieniu pod numer onActivityResult()
. Googling wokół, znalazłem this question and answer, co powiedziećCzy bezpieczne jest włanie FragmentTransaction wewnątrz onActivityResult()?
W czasie,
onActivityResult()
nazywa, stan aktywności/fragment może jeszcze nie zostały przywrócone, a zatem wszelkie transakcje, które zdarzają się w tym czasie zostaną utracone w wyniku .
Po zamknięciu dostosowałem rozwiązanie zalecane w tej samej odpowiedzi do mojej aplikacji, a życie było dobre. Jednak ostatnie eksperymenty pokazują, że być może rzeczy się zmieniły i teraz można bezpiecznie zabezpieczyć od FragmentTransaction
od środka .
The documentation for (support v4) FragmentManager.beginTransaction()
określa bezpieczne okno do transakcji jak:
Uwaga: Transakcja fragment mogą być tworzone tylko/popełnione przed działalności zbawczej jego stan. Jeśli próby popełnienia transakcję po
FragmentActivity.onSaveInstanceState()
(i przed następnymFragmentActivity.onStart
lubFragmentActivity.onResume()
, dostaniesz błąd.
Reading the documentation for onActivityResult()
widzę
natychmiast otrzymasz to wezwanie przed
onResume()
kiedy twoja aktywność się ponownie rozpoczyna
To prowadzi mnie do przekonania, że bezpieczne jest wykonywanie tych transakcji w onActivityResult()
, as onStart()
zostanie już wywołany, umieszczając mnie w bezpiecznym oknie.
Zrobiłem aplikację, aby przetestować to i pomyślnie widzę fragmenty okien dialogowych, które tworzę i zatwierdzam wewnątrz onActivityResult()
. Miałem tę samą aplikację rejestrującą również wywołania zwrotne cyklu życia aktywności, więc mogłem sprawdzić ich kolejność i widzę onStart()
, następnie onRestoreInstanceState()
, a następnie onActivityResult()
za każdym razem.
Czy brakuje mi czegoś? A może ramy zostały zmienione, a teraz onActivityResult()
gwarantuje bezpieczne miejsce na transakcje fragmentacyjne? Czy to zachowanie różni się w zależności od poziomu interfejsu API?
Znalazłem another question and answer, który wydaje się czytać dokumentację w ten sam sposób co ja, ale oba mają ponad rok i nie odnoszą się do onActivityResult()
jako bezpiecznego miejsca transakcji.
Spójrz na http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html – elmorabea
@elmorabea Ten post na blogu jest jednym z materiałów, które odnalazłem, kiedy po raz pierwszy ten przypadek. Jednak, jak ilustruje poniższa odpowiedź Azizbekian, wydaje się, że nie jest już dokładnym wyjaśnieniem bezpiecznego okna do zatwierdzenia FragmentTransactions. –