Android 保存状态异常

Android 保存状态异常,android,Android,我的应用程序出现以下异常。我相信当用户离开应用程序很长一段时间,然后返回应用程序时,就会发生这种情况。我无法复制它,但是它经常出现在我的崩溃日志中。我不知道为什么会发生这种情况,因此非常感谢您的任何建议 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.MyActivity}: java.lang.ArrayIndexOutOfBoundsException: length

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

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
FragmentManager.enableDebugLogging(true);
我的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);

}

我遇到了同样的问题,我相信这是安卓系统的一个缺陷。查看此线程以寻找可能的解决方案

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

我使用了以下方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    // line 235
FragmentManager.enableDebugLogging(true);
这将在日志中显示
FragmentManager
上的所有调用(添加、删除、隐藏片段等)

它让我看到了我的情况中的错误,我的应用程序中的一个片段有时没有正确地保存在实例中,其内容为空

然后,当应用程序尝试从实例还原此空片段时,崩溃发生在相同的错误日志中


在我的例子中,这个片段有点特殊,是自动创建的。为了确保不再出现错误,在退出
活动之前,我从
FragmentManager
中删除了片段
,我也遇到了同样的问题,方向发生了变化,但这只发生在较旧的安卓版本(4.0.4)中,像4.4.2这样的较新版本也可以。我想和你分享我是如何修复它的

正如肯尼和约安所说,我用

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(最终Bundle outstate)
中就是这么做的:


是因为在保存时,id1、id2、id3、id4中的一个等于-1吗?它们不应该是-1,但是,我不相信int的值很重要。你确定第235行就是那一行吗。你从中获取日志的版本与你检查的版本相同?是的,我检查了三次。您还可以在stacktrace中看到调用了父onCreate()。在对itI采取任何措施之前,您需要找到复制它的步骤。我不确定这是否是完全相同的错误。电话号码断了。当然,这可能只是支持库的另一个版本,具有相同的bug。。。或者它可能是另一个bug。请投票选择
FragmentManager.enableddebuglogging(true)