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)