在显示ProgressDialog时避免锁定屏幕

时间:2013-08-08 10:57:17

标签: android android-asynctask

我想显示progressBar,而某些指令在后台执行,但我不想锁定屏幕。此代码锁定屏幕:

private class ConvertDataInBackground extends AsyncTask<Params, Void, Boolean> {

        private MyProgressDialog mProgressDialog;

        @Override
        public void onPreExecute() {
            if(mProgressDialog == null)
                mProgressDialog = MyProgressDialog.show(mActivity, null, null);
        }

        @Override
        protected Boolean doInBackground(Params...params) {
            boolean conversionResult = executeConversion(params[0].item1, params[0].item2, params[0].item3);
            return conversionResult;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            try {
                if(mProgressDialog.isShowing()) 
                    mProgressDialog.dismiss();
                if(result) {
                    Toast toast = Toast.makeText(mActivity, R.string.conversion_result, Toast.LENGTH_SHORT);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

在后台执行指令可能需要一段时间,我希望用户能够使用该界面。 你还知道我们可以使用界面,而progressDialog显示在顶部吗?

2 个答案:

答案 0 :(得分:4)

Android中的对话通常是模态的。您可以尝试创建对话框,然后将FLAG_NOT_TOUCH_MODAL添加到其窗口参数中 - 但我不确定它是否可行。它背后的想法将是这样的:

ProgressDialog dialog = new ProgressDialog(this);
dialog.setMessage(...);
dialog.setTitle(...);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

请注意,同时向您的活动布局添加ProgressBar并在需要时显示而不是创建对话框可能更容易 - 事实上,这是Google文档推荐的内容。 Android developer's guide on dialogs有这样的说法:

  

避免使用ProgressDialog

     

Android包含另一个名为ProgressDialog的对话框,显示   带进度条的对话框。但是,如果您需要指示加载   或者不确定的进展,你应该遵循设计   Progress & Activity的指南并在您的ProgressBar中使用{{1}}   布局。

答案 1 :(得分:2)

我认为在你的活动中你必须指定FLAG_KEEP_SCREEN_ON标志:

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

对我而言,它有效。