后台任务片段和“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调用之后活动未附加。
那么如何在将来避免这个错误呢? 谢谢!
在onPause
, onStop
或onDestroy
,在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(); } }