保存状态异常

时间:2012-06-10 21:49:09

标签: android

我的应用程序出现以下异常。我相信当用户离开应用程序很长一段时间然后返回它时会发生这种情况。我无法复制它,但它在我的崩溃日志中出现了很多。我不知道为什么会这样,所以我们非常感谢任何建议。

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

第235行如下:

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

我的onSaveInstanceState()非常简单:

@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);

}

3 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,我相信它是android的一个bug。请查看此主题以获取可能的解决方案http://code.google.com/p/android/issues/detail?id=22404

答案 1 :(得分:2)

我遇到了完全相同的问题,我遵循了Kenny链接中给出的建议:

我使用了以下内容:

FragmentManager.enableDebugLogging(true);

这将在日志中显示FragmentManager上的所有呼叫(添加,删除,隐藏等片段)。

它允许我看到我的情况有什么问题,我的应用程序中的一个片段有时在实例中没有正确保存,其内容为空。

然后当应用程序尝试从实例恢复此空片段时,崩溃发生了相同的错误日志。

在我的情况下,这个片段有点特殊,并自动创建。为确保不再出现错误,我在退出FragmentManager之前从Activity删除了片段。

答案 2 :(得分:0)

我遇到了同样的问题,发生了方向更改,但只发生在较旧的Android版本(4.0.4),4.4.2这样的新版本很好。我想与你分享我是如何解决它的。

正如Kenny和Yoann建议的那样,我使用了

FragmentManager.enableDebugLogging(true);

并发现已经完成了太多的移除工作。我必须从代​​码中删除ft.remove(df),现在上面提到的两个版本都没问题。这是我的代码:

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();
}

为了完整起见,这就是我在onSaveInstanceState(final Bundle outstate)中所做的:

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