显示警报对话框时是否可以阻止 UI 线程

Is it ok to block UI thread while showing an Alert dialog

我有这个方法,它基本上等待单例队列中的项目变空,有一个后台服务 运行,一旦删除队列中的所有项目并处理每个项目,该服务就会停止一个。这段代码运行在主线程中,我在这里调用wait会发生什么?警报对话框是否仍会显示并阻止用户执行任何其他操作?

void waitForService() {
    openConnectionToUploadQueue();
    if(answersQueue.getCount(objInterviewQuestion.getQid()) <= 0){
        answersQueue.close();
        return;
    }
    if(!answersQueue.isInterviewUploadServiceRunning()) {
        answersQueue.startInterviewUploadService();
    }
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(getString(R.string.auto_submit_alert_title));
    builder.setCancelable(false);
    builder.setMessage(R.string.uploading_pending_answers);
    AlertDialog waitForServiceDialog = builder.create();
    waitForServiceDialog.show();
    while (answersQueue.getCount(objInterviewQuestion.getQid()) > 0) {
        // do nothing and keep loop running till answersQueue is empty
    }
    waitForServiceDialog.dismiss();
}

你永远不应该阻塞 UI 线程。当您按住 UI 线程太久时,系统将显示一个对话框,提示 XXX is not responding 并要求用户终止您的应用程序。

相反,您应该使用回调式调用,当服务启动并且您收到来自回调的方法调用时,您可以关闭对话框。

编辑:

如前所述,您需要实施 BroadcastReceiver

这是我的其他项目的演示项目,您可以将其用作有关如何创建和使用的示例BroadcastReceiver

https://github.com/cyfung/ActivityRecognitionSample