【发布时间】:2012-05-25 20:11:57
【问题描述】:
有很多关于如何在 AsyncTask 期间处理配置更改的帖子,但我没有找到一个关于 AsyncTask 完成并尝试关闭 DialogFragment(兼容性图书馆)。
这就是问题所在,如果我正在运行的 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();
}
}
Activity 看起来像这样:
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 版本不是有这样的吗?
【问题讨论】:
-
看看我的blog post关于这个主题......也许它会有所帮助。
标签: java android android-fragments