后台任务片段和“onSaveInstanceState后无法执行此操作”

我在Fragment中有以下AsyncTask(该示例被简化以清楚地显示错误):

private class LoginTask extends AsyncTask { @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调用之后活动未附加。

那么如何在将来避免这个错误呢? 谢谢!

onPauseonStoponDestroy ,在AsyncTask上调用.cancel() (这可能要求您的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()中的任何循环中检查isCancelled() ,这样一旦此人离开应用程序,您就不会继续执行操作。

isFinishing()方法应该在这里帮助你。

 @Override protected void onPostExecute(Void result) { FragmentActivity act = (FragmentActivity) getActivity(); if (act != null && !act.isFinishing() && isAdded()) { act.getSupportFragmentManager().beginTransaction() .add(new LoginDialogFragment(), "loginMessage").commit(); } }