我有一个应用程序在AsyncTask.
中执行长时间的任务
结果可以显示在dialog
中,当应用程序处于后台时,会出现IllegalStateException!
*编辑*
My Asynctask,执行Internet请求。通常它应该花费很长时间,但由于特殊原因,在我的测试中,它花了很长时间,所以我把应用程序放在后台,看看我的互联网参数有什么问题。这就是我在这种情况下遇到的情况,我可能会在应用程序处于后台时显示对话框的情况。
所以,我应该准确地在postExecute方法中有效地显示这个对话框。
代码的摘录是:
static class InitTask extends AsyncTask<Integer, Integer, Integer> {
// Référence faible à l'activité
private Fragment_init mActivity = null;
private FragmentManager fragmentManager;
private DialogFragment dialog;
private Site site = null;
Context context = null;
public InitTask (Fragment_init pActivity, Site pSite, FragmentManager _fragmentManager) {
mActivity = pActivity;
context = mActivity.getActivity();
site = pSite;
fragmentManager = _fragmentManager;
}
@Override
protected void onPreExecute () {
}
@Override
protected void onPostExecute (Integer result) {
mActivity = (Fragment_init) site.getFragmentActivity();
if(result != 1) {
String msg;
dialog = new YesNoDialog();
Bundle args = new Bundle();
args.putString("title", mActivity.getResources().getString(R.string.label_titleAlertInit));
switch (result) {
case -1:
msg = mActivity.getResources().getString(R.string.label_messageAlertCnfVDescFile);
break;
case nnn:
....
break;
default:
msg = mActivity.getResources().getString(R.string.label_messageAlertCnfUnknown);
break;
}
args.putString("message", msg);
args.putString("positiveButton", site.getMainActivity().getResources().getString(R.string.label_positiveBtnOk));
dialog.setArguments(args);
dialog.setTargetFragment(site.getFragmentActivity(), Site.MSG_ALERT_CONFIGURATION_ERROR);
dialog.show(fragmentManager, "tag"); // I get the IllegalStateException here
......
如何应对这种情况? 我是否必须等待应用程序返回前台,如果是,如何?
此致
答案 0 :(得分:0)
一种可能的解决方案是将commit()
替换为commitAllowingStateLoss()
。如果任务在后台完成,它将尝试并失败,以显示您的对话但它不会抛出异常或导致崩溃。缺点是你的对话框永远不会出现。
如果您希望在应用重新打开时显示对话框,则基本上可以使用2个路径。
1)在Activity的onPause()
方法中,您可以取消AsyncTask。在Activity的onResume()
方法中,您可以重新启动AsyncTask。这通常是最好的做法(因为您的活动在不主动运行时不应该做太多)。缺点是你的用户在重新启动Activity时必须等待整个AsyncTask重新完成。
2)使用几个标志来指示事件何时发生。像下面这样......
public class MyActivity extends Activity {
private boolean mIsActive = false;
private boolean mDialogPending = false;
private YesNoDialog mDialog = null;
...
public void showDialog(YesNoDialog dialog) {
if (mIsActive) {
// Our Activity is in the foreground, show normally
dialog.show(...); // fill in FragmentManager etc
} else {
// Our Activity is in the background, we can't show yet
mDialog = dialog;
mDialogPending = true;
}
@Override
public void onResume() {
super.onResume();
mIsActive = true;
if (mDialogIsPending) {
// Our dialog has been waiting for us to get back, show it now
mDialogIsPending = false;
mDialog.show(...); // fill in FragmentManager etc
}
}
@Override
public void onPause() {
super.onPause();
mIsActive = false;
}
}