0

首先,对于我的具体问题,这个特别的问题没有得到回应。所以不要标记为重复,因为我在 StackOverflow 中还没有找到有效的响应。

考虑这段代码:

package xxx.MyActivity;

import com.xxx.R;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;

public class MyActivity extends Activity {

    private ProgressDialog progressDialog;
    private AlertDialog.Builder alertDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.my_activity);

        new MyTask().execute();
    }

    private class MyTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = ProgressDialog.show(MyActivity.this,
                    getText(R.string.activity_dialog_generic_title),
                    getText(R.string.activity_reading), true);
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            progressDialog.dismiss();

            alertDialog = new AlertDialog.Builder(MyActivity.this);
            alertDialog.setCancelable(false);
            alertDialog.setMessage("dialog message");
            alertDialog.setPositiveButton("yes", null);
            alertDialog.setNegativeButton("no", null);
            alertDialog.show();
        }



        @Override
        protected Void doInBackground(Void... params) {

            int i = 0;
            while (++i < 10) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                }
            }

            return null;
        }
    }
}

如您所见,progressDialogalertDialog都是活动的变量。现在:

  1. 开始活动
  2. 等待显示进度
  3. 使用主页按钮“最小化”应用程序
  4. 等待 10 秒
  5. 返回应用程序

而且我没有警报对话框,并且 UI 被冻结(并且像显示对话框但屏幕上没有对话框时一样变灰)。后退按钮无效。

编辑:

在 onPostExecute() 中添加此代码:

alertDialog.setOnCancelListener(new AlertDialog.OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
        finish();
    }
});

UI 看起来仍然冻结,但触摸屏幕(对话框取消)将关闭活动(如预期的那样:finish())。

我还尝试评论以下行alertDialog.show();:没有冻结的 UI,所以问题出在AlertDialog.

4

1 回答 1

0

我找到了解决该问题的方法。

使用showAlertActivity 中的变量,我可以知道,当 Activity 恢复时,之前是否显示了警报。如果为真,我强制 dialog.show()

不,它按预期工作。遵循showAlert变量的使用。

public class MyActivity extends Activity {

    private ProgressDialog progressDialog;
    private AlertDialog.Builder alertDialog;

    private volatile boolean showAlert;

    @Override
    protected void onResume() {
        super.onResume();

        try {
            if (alertDialog != null) {
                if (showAlert) {
                    alertDialog.show();
                }
            }
        } catch (Exception e) {
            finish();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.my_activity);

        new MyTask().execute();
    }

    private class MyTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            showAlert = false;

            progressDialog = ProgressDialog.show(MyActivity.this,
                    getText(R.string.activity_dialog_generic_title),
                    getText(R.string.activity_reading), true);
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            progressDialog.dismiss();

            alertDialog = new AlertDialog.Builder(MyActivity.this);
            alertDialog.setCancelable(false);
            alertDialog.setMessage("dialog message");
            alertDialog.setPositiveButton("yes", null);
            alertDialog.setNegativeButton("no", null);
            alertDialog.show();
            showAlert = true;
        }

        @Override
        protected Void doInBackground(Void... params) {

            int i = 0;
            while (++i < 10) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                }
            }
            return null;
        }

    }
}
于 2013-07-10T10:22:19.463 回答