如何处理在 AsyncTask 完成后关闭 DialogFragment(兼容库)
有许多关于如何在 AsyncTask 期间处理配置更改的帖子,但是我没有找到一个关于在 AsyncTask 完成并尝试关闭 DialogFragment(兼容性库)时处于后台(onPause())的应用程序的明确解决方案。
这就是问题所在,如果我有一个AsyncTask正在运行,它应该在onPostExecute()中关闭DialogFragment,如果应用程序在尝试关闭DialogFragment时处于后台,我会收到一个非法StateException。
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()时,我得到一个非法状态异常。
05-25 16:36:02.237: E/AndroidRuntime(965): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
我看到的所有帖子似乎都指向一些笨拙的方向,并提出了详细的解决方法。难道没有一些机器人方法来处理这个问题吗?如果它是对话框而不是对话框碎片,则活动的 dismissDialog() 将正确处理它。如果它是一个真正的DialogFragment而不是来自ACP的DialogFragment,那么discolenAllowingStateLoss()将处理它。ACP版本的DialogFragment不是有这样的东西吗?