如何在应用程序处于后台时处理对话框

时间:2014-09-15 19:44:09

标签: android

我有一个应用程序在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

  ......

如何应对这种情况? 我是否必须等待应用程序返回前台,如果是,如何?

此致

1 个答案:

答案 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;
    }
}