2012-08-10 20 views
17

Mam poważny problem z moim App stale upaść na niektórych urządzeniach użytkowników z następującym wyjątkiem w działaniu onStart Metoda:IllegalStateException - Fragment biblioteki wsparcie

Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299) 
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310) 
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541) 
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525) 
at android.support.v4.app.DialogFragment.show(DialogFragment.java:123) 

I nie można odtworzyć tego błędu lokalnie w moim emulatorze. Znalazłem kilka pytań dotyczących tej kwestii na StackOverflow: here i here

Próbowałem sugerowane rozwiązanie, to znaczy nie pozwalają pustych pakietów w onSaveInstance ani we fragmentach, ani działalności.

Jednak problem pozostaje. Jest to jedyny raport o katastrofie, jaki kiedykolwiek otrzymałem i otrzymuję go nieprzerwanie.

Czy ktoś ma działające rozwiązanie?

Odpowiedz

7

Mam rozwiązać ten problem przez

Sprawdź moją odpowiedź tutaj kod: "Can not perform this action after onSaveInstanceState" - why am I getting this exception from my activity's onResume method?

Nie mam więcej IllegalStateException tak daleko.

4

I rozwiązać to za pomocą this workaround, czyli umieścić kod do metod onPostResume() funkcję w działalności

+0

Czy to działa, jakieś problemy? –

+0

W dół głos: onPostResume nie jest dostępny dla android.support.v4.app.Fragment – Loda

+1

@Loda jest w android.support.v4.app.FragmentActivity, a nie Fragment – CACuzcatlan

-1

Read This Article.

I

This one.

Gdy sprawa jest zrozumiała, iść do przodu i odpowiednio zmienić:

Fig wyjaśnij, dlaczego transakcje odbywają się poza twoim stanem onResume. Dlaczego takie rzeczy dzieją się, kiedy nie powinny. Dlaczego ręcznie dodajesz i usuwasz fragmenty w odniesieniu do cyklu życia Twojej aplikacji, a nie wtedy, gdy użytkownik tego żąda. Powinieneś potrzebować jednego razu w onCreate() lub gdy użytkownik coś wywoła. Ale dlaczego w pierwszej kolejności mieszasz się z nimi w onResume()? Nie rób tego.

Jeśli zmienisz wszystkie .commit() na .commitAllowStateLoss(), awarie znikną. Ale lepiej nie rób tego. Lepiej upewnij się, że nigdy nie zmieniasz swoich fragmentów, z wyjątkiem sytuacji, gdy aplikacja jest w pełni aktywna. Czasami oznacza to, że nigdy nie ładujesz fragmentu z OnActivityResult(), ale raczej chcesz go uruchomić w swoim onPostResume() i unikasz wykonywania zmian w Asi w wątkach asynchronicznych, które błędnie zakładają, że nie mogłeś w międzyczasie zabić działania.

Jeśli chcesz wszystko spakować, zrobi to .commitAllowStateLoss(). Jeśli chcesz zrobić to dobrze, upewnij się, że nie skrzywdzisz swoich fragmentów po śmierci.

Jedna z nowszych form Androida około Oreo Myślę, że zmieniła to, aby uniknąć tego irytującego błędu.Moja odpowiedź wydaje się nieco niejasna, ale dlatego, że błąd jest w paradygmacie. Możesz to osiągnąć za pomocą różnych elementów kodu i dość rutynowo.

Powiązane problemy