0

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

那么以后如何避免这个错误呢?谢谢!

4

2 回答 2

4

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();
        }
    }
于 2012-09-09T21:00:04.843 回答
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()这样您就不会在该人离开应用程序后继续做任何事情。

于 2012-09-09T20:59:35.187 回答