我在Fragment中有以下AsyncTask(为了清楚地显示错误,该示例已经过简化):
private class LoginTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// Do network login
return null;
}
@Override
protected void onPostExecute(Void result) {
FragmentActivity act = (FragmentActivity) getActivity();
if (act != null && isAdded()) {
act.getSupportFragmentManager().beginTransaction()
.add(new LoginDialogFragment(), "loginMessage").commit();
}
}
}
一旦在任务运行时离开应用程序,我收到了IllegalStateException: Can not perform this action after onSaveInstanceState
。
我想这是因为我在活动的onSaveInstanceState和活动中片段的取消附加之间调用它(或者因为在getActivity()调用和add-fragment调用之后活动未附加。
那么我将来如何避免这个错误呢?谢谢!
答案 0 :(得分:2)
在onPause
,onStop
或onDestroy
,致电.cancel()
上的AsyncTask
(这可能要求您的AsyncTask
是会员你活动中的变量)。然后,在onPostExecute()
方法中,检查流程是否已取消。
protected void onPostExecute(Void result) {
if (!isCancelled()) { // Do stuff only if not cancelled
FragmentActivity act = (FragmentActivity) getActivity();
if (act != null && isAdded()) {
act.getSupportFragmentManager().beginTransaction()
.add(new LoginDialogFragment(), "loginMessage").commit();
}
}
return null;
}
注意:您可能还希望在isCancelled()
中的任何循环中检查doInBackground()
,这样一旦此人离开应用后您就不会继续这样做。