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

时间:2012-09-09 20:56:56

标签: java android multithreading android-fragments

我在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调用之后活动未附加。

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

1 个答案:

答案 0 :(得分:2)

onPauseonStoponDestroy,致电.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(),这样一旦此人离开应用后您就不会继续这样做。