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.

おそらく、Activiy の 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

、、またはonPauseで、 を呼び出します(これには、アクティビティのメンバー変数である必要がある場合があります)。次に、メソッドで、プロセスがキャンセルされたかどうかを確認します。onStoponDestroy.cancel()AsyncTaskAsyncTaskonPostExecute()

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 に答える