在一些不活动后,我的应用程序间歇性地崩溃。所以我认为我没有正确存储东西。我打开“不要保留活动”进行故障排除,现在我的应用程序到处崩溃。
堆栈跟踪:https ://gist.github.com/hanleyhansen/6d41fee54b1e129b7922 这是丢失的布局:https ://gist.github.com/hanleyhansen/73ace0c99ae675023e0f
在一些不活动后,我的应用程序间歇性地崩溃。所以我认为我没有正确存储东西。我打开“不要保留活动”进行故障排除,现在我的应用程序到处崩溃。
堆栈跟踪:https ://gist.github.com/hanleyhansen/6d41fee54b1e129b7922 这是丢失的布局:https ://gist.github.com/hanleyhansen/73ace0c99ae675023e0f
我认为您可能遇到了Issue 19917的症状。此错误存在于 3.2 及更高版本中,最近才修复 (4.2)。同样的修复还没有进入支持库。
查看评论 28以获得真正的修复:您需要编辑您的支持库并重新编译。编辑 v4/java/android/support/v4/app/FragmentManager.java
Bundle saveFragmentBasicState(Fragment f) {
Bundle result = null;
if (mStateBundle == null) {
mStateBundle = new Bundle();
}
f.onSaveInstanceState(mStateBundle);
if (!mStateBundle.isEmpty()) {
result = mStateBundle;
mStateBundle = null;
}
if (f.mView != null) {
saveFragmentViewState(f);
}
if (f.mSavedViewState != null) {
if (result == null) {
result = new Bundle();
}
result.putSparseParcelableArray(
FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState);
}
if (!f.mUserVisibleHint) {
// Only add this if it's not the default value
// @@@ BUG, result may not have been created, can be null!
if (result == null) {
result = new Bundle();
}
result.putBoolean(FragmentManagerImpl.USER_VISIBLE_HINT_TAG, f.mUserVisibleHint);
}
return result;
}
如果您无法完成任务并希望等待 Google 修复支持库,这里是另一种解决方法 评论 8进行修复,您可以将其应用于所有片段
@Override
public void onSaveInstanceState(Bundle outState) {
//first saving my state, so the bundle wont be empty.
//http://code.google.com/p/android/issues/detail?id=19917
outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
super.onSaveInstanceState(outState);
}
我也遇到过transaction.commitAllowingStateLoss();
这个问题的“修复”,而不是transaction.commit();
我发现的一些其他背景信息和解决方法有助于我解决片段问题(尤其是嵌套它们时)