2012-06-10 12 views
7

Otrzymuję następujący wyjątek w mojej aplikacji. Sądzę, że dzieje się tak, gdy użytkownik opuszcza aplikację przez dłuższy czas, a następnie wraca do niej. Nie mogę go zreplikować, ale jest często wyświetlany w dziennikach awarii. Nie mam pojęcia, dlaczego tak się dzieje, więc wszelkie sugestie są mile widziane.Zapisany wyjątek stanu

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.MyActivity}: java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2237) 
at android.app.ActivityThread.access$600(ActivityThread.java:139) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:4974) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1 
at java.util.ArrayList.get(ArrayList.java:306) 
at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1764) 
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:198) 
at com.myapp.MyActivity.onCreate(MyActivity.java:235) 
at android.app.Activity.performCreate(Activity.java:4538) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158) 
... 11 more 

Linia 235 jest następująca:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); // line 235 

Moja onSaveInstanceState() jest dość prosta:

@Override 
public void onSaveInstanceState(Bundle state) { 
    super.onSaveInstanceState(state); 

    state.putInt("id1", id1); 
    state.putInt("id2", id2); 
    state.putInt("id3", id3); 
    state.putInt("id4", id4); 

} 
+0

jest to, ponieważ jeden z ID1, ID2, ID3, ID4 równa się -1, gdy oszczędzasz? – Blundell

+0

Nie powinny one nigdy wynosić -1, jednak nie wierzę w wartość int. – Nick

+0

Czy na pewno linia 235 jest tą linią. Kompilacja, z której otrzymałeś Log from, jest tym samym co sprawdzasz? – Blundell

Odpowiedz

4

wpadłem na ten sam problem, uważam, że to błąd z android. Spójrz na tego wątku do możliwego rozwiązania http://code.google.com/p/android/issues/detail?id=22404

+0

Nie jestem pewien, czy to dokładnie ten sam błąd. Numery linii są wyłączone. Oczywiście może to być po prostu inna wersja biblioteki wsparcia z tym samym błędem ... lub może to być inny błąd. – P1r4nh4

2

dostałem dokładnie ten sam problem, I przestrzegać zaleceń podanych w Kenny'ego link:

użyłem następujące:

FragmentManager.enableDebugLogging(true); 

To spowoduje wyświetlenie w dziennikach wszystkie wywołania na FragmentManager (fragmenty dodane, usunięte, ukryte itp.).

Pozwoliło mi to zobaczyć, co było nie tak w moim przypadku, jeden z fragmentów w mojej aplikacji czasami nie był poprawnie zapisany w instancji, a jego zawartość była zerowa.

Następnie nastąpiła awaria z tym samym dziennikiem błędów, gdy aplikacja próbowała przywrócić ten pusty fragment z instancji.

W moim przypadku ten fragment był trochę wyjątkowy i utworzony automatycznie. Aby upewnić się, że błąd nie wystąpi ponownie, usunąłem fragment z FragmentManager przed zakończeniem pracy z Activity.

+2

Awans do 'FragmentManager.enableDebugLogging (true)' – Robert

0

Miałem ten sam problem, występujący przy zmianie orientacji, ale zdarzało się to tylko w starszych wersjach Androida (4.0.4), nowsze wersje, takie jak 4.4.2, były w porządku. Chcę się z wami podzielić, jak to naprawiłem.

Jak Kenny i Yoann zasugerował, użyłem

FragmentManager.enableDebugLogging(true); 

i okazało się, że zbyt wiele usunięcie zostało zrobione. Musiałem usunąć ft.remove(df) z mojego kodu i teraz jest dobrze w obu wersjach wymienionych powyżej. To jest mój kod:

if (savedInstanceState != null) { 
    final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    final DialogFragment df = (DialogFragment) getFragmentManager().findFragmentByTag("tag"); 
    if (df != null) { 
     df.dismiss(); 
     // ft.remove(df); 
     frag = new MyDialogFragment(); 
     frag.show(getFragmentManager(), "tag"); 
    } 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

Dla kompletności, to co mam zrobić w onSaveInstanceState(final Bundle outstate):

if (frag != null) { 
    getFragmentManager().putFragment(outState, "tag", frag); 
} 
Powiązane problemy