AsyncTask 中に構成の変更を処理する方法に関する投稿は多数ありますが、AsyncTask が終了して DialogFragment (互換性ライブラリ) を閉じようとするときにバックグラウンド (onPause()) にあるアプリに関する明確な解決策を提供するものは見つかりませんでした。
onPostExecute() で DialogFragment を却下する必要がある AsyncTask を実行している場合、DialogFragment を却下しようとしたときにアプリがバックグラウンドにある場合、IllegalStateException が発生します。
private static class SomeTask extends AsyncTask<Void, Void, Boolean> {
public SomeTask(SomeActivity tActivity)
{
mActivity = tActivity;
}
private SomeActivity mActivity;
/** Set the view during/after config change */
public void setView(Activity tActivity) {
mActivity tActivity;
}
@Override
protected Boolean doInBackground(Void... tParams) {
try {
//simulate some time consuming process
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException ignore) {}
return true;
}
@Override
protected void onPostExecute(Boolean tRouteFound) {
mActivity.dismissSomeDialog();
}
}
アクティビティは次のようになります。
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
public class SomeActivity extends FragmentActivity {
public void someMethod() {
...
displaySomeDialog();
new SomeTask(this).execute();
...
}
public void displaySomeDialog() {
DialogFragment someDialog = new SomeDialogFragment();
someDialog.show(getFragmentManager(), "dialog");
}
public void dismissSomeDialog() {
SomeDialogFragment someDialog = (SomeDialogFragment) getFragmentManager().findFragmentByTag("dialog");
someDialog.dismiss();
}
....
}
SomeTask がまだ実行されている間にアプリがバックグラウンドに切り替わらない限り、正常に動作します。その場合、SomeTask が SomeDialog() を却下しようとすると、IllegalStateException が発生します。
05-25 16:36:02.237: E/AndroidRuntime(965): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
私が見たすべての投稿は、精巧な回避策を備えた不器用な方向を指しているようです。これを処理するアンドロイドの方法はありませんか?それが DialogFragment ではなく Dialog である場合、Activity の DismissDialog() はそれを正しく処理します。ACP からの DialogFragment ではなく実際の DialogFragment である場合は、dismissAllowingStateLoss() が処理します。DialogFragment の ACP 版にこんなものはありませんか?