有很多关于如何在 AsyncTask 期间处理配置更改的帖子,但是我没有找到一个关于 AsyncTask 完成并尝试关闭 DialogFragment(兼容性库)时处于后台的应用程序(onPause())的明确解决方案。
这是问题所在,如果我有一个正在运行的 AsyncTask 应该在 onPostExecute() 中关闭 DialogFragment,如果应用程序在后台尝试关闭 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
我看到的所有帖子似乎都指向了一些笨拙的方向,并提供了精心设计的解决方法。是不是有一些android的方式来处理这个?如果它是 Dialog 而不是 DialogFragment,那么 Activity 的 dismissDialog() 将正确处理它。如果它是一个真正的 DialogFragment 而不是来自 ACP 的一个,那么 dismissAllowingStateLoss() 将处理它。DialogFragment 的 ACP 版本不是有这样的东西吗?