在ProgressDialog显示时避免锁屏

3

我希望在后台执行一些指令时显示进度条,但不想锁定屏幕。以下代码会锁定屏幕:

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();
            }
        }
}

在后台执行指令可能需要花费一些时间,但我希望用户能够在界面上进行操作。 您是否知道在进度对话框显示的同时,我们如何与界面进行交互的方法?


1
Android中的对话框通常是模态的。您可以尝试创建对话框,然后将FLAG_NOT_TOUCH_MODAL添加到其窗口参数中 - 但我不确定它是否有效。 - Aleks G
谢谢@AleksG。你可以分享你的答案,我会接受的。 - Ali
看一下 PowerManager API 和 WakeLock 方法。有各种标志可以调用以防止屏幕变暗、锁定和休眠。https://developer.android.com/reference/android/os/PowerManager.html#SCREEN_DIM_WAKE_LOCK - Joshua Pinter
2个回答

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 开发者指南 中有这样的建议:

避免使用 ProgressDialog

Android 包含另一种名为 ProgressDialog 的对话框类,它显示带有进度条的对话框。但是,如果您需要指示加载或不确定性进度,则应遵循 Progress & Activity 的设计准则,在您的布局中使用 ProgressBar


2
我认为在你的活动中,你必须指定FLAG_KEEP_SCREEN_ON标志:
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

对我来说,它很有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接