在我的应用我想实现以下逻辑之一:删除片段)
1)在活动的在onStart()启动一些网络操作,并添加进度片段:
@Override
protected void onStart() {
super.onStart();
refreshData();
}
private void refreshData() {
if (!isInProgress)
{
showSpinner();
}
//Do boring network request
.......
}
private void showSpinner() {
getSupportFragmentManager().beginTransaction()
.add(new ProgressFragment(), "").addToBackStack("")
.commitAllowingStateLoss();
}
private void hideSpinner() {
getSupportFragmentManager().popBackStack();
}
2)的onStop()在 - 取消活动的网络操作(如果有的话),并停止进度条(如果运行):
@Override
protected void onStop() {
if (isInProgress) {
//cancel network op
....
hideSpinner();
}
super.onStop();
}
3)的onSaveInstanceState()期间保存一些UI状态:
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
super.onSaveInstanceState(outState);
}
所以,问题是,onSaveInstanceState()
被onStop()
之前调用,所以当我尝试删除我的进度条 - 我得到java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
例外
显然我失去了一些东西基本在活动< - >片段互动,那么处理我的用例的正确方法是什么?
我不是100%确定这个。但我认为'onSaveInstanceState()'与'onStop()'方法相关联。那么也许你可以把当前在'onStop()'中的代码放入'onPause()'中? – Dreagen
@Dreagen'onSaveInstanceState()'将在'onStop()'之前调用(如果完全调用它 - 如果Activity正在完成,则不会保存状态)。但是,在Android 3.0之前,它可能会在'onPause()'之前被调用。 – kcoppock
尽管它没有提供针对您的特定情况的解决方案,但[this](http://www.androiddesignpatterns。com/2013/08/fragment-transaction-commit-state-loss.html)是一个非常好的资源,它是关于响应不直接附加到活动生命周期的异步进程执行片段事务的问题。 – kcoppock