Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 显示警报对话框时阻止UI线程可以吗_Java_Android_Intentservice - Fatal编程技术网

Java 显示警报对话框时阻止UI线程可以吗

Java 显示警报对话框时阻止UI线程可以吗,java,android,intentservice,Java,Android,Intentservice,我有一种方法,它基本上是等待单例队列中的项目变为空,有一个后台服务正在运行,一旦它删除队列中的所有项目并逐个处理,服务就会停止。这段代码在主线程中运行,当我调用wait here时会发生什么?警报对话框是否仍会显示并阻止用户执行任何其他操作 void waitForService() { openConnectionToUploadQueue(); if(answersQueue.getCount(objInterviewQuestion.getQid()) <= 0){

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

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();
}
void waitForService(){
OpenConnectionUploadQueue();
if(answersque.getCount(objInterviewQuestion.getQid())0){
//什么也不做,保持循环运行,直到应答器为空
}
waitForServiceDialog.discouse();
}

您不应该阻止UI线程。当您按住UI线程太长时间时,系统将显示一个对话框,说明
XXX没有响应
,并要求用户终止您的应用程序

相反,您应该使用回调样式的调用,当服务启动时,您从回调接收到方法调用,您将关闭该对话框

编辑:

如前所述,您需要实现
BroadcastReceiver

这是我的一个演示项目,您可以使用它作为如何创建和使用
BroadcastReceiver
的示例


这是个坏主意,永远不要阻塞ui线程,而是使用一个回调函数关闭对话框。您当前的实现可能会产生anr崩溃。刚刚意识到在这里调用wait()是愚蠢的编辑了这个问题,这样我就不会在未来的访问者面前显得愚蠢了>>我该如何做我的服务是以这样的方式构建的:从我的活动中,我将对象推到队列中,然后忘记它们,我的服务负责上传它们,并且没有来自服务的回调。即使我要创建一个回调接口,我如何将这个接口的实现传递给服务呢?你只是说你有一个负责上传的服务。在您的服务中,您应该发送一个
广播
,当为服务运行接收的广播完成时,您的活动应该在那里注册一个
广播接收器
,您关闭对话框很遗憾,这不适合我,因为该服务将被多次调用和关闭,大多数情况下,我不想显示任何对话框。您只需在是否等待关闭对话框时保持标记。或者更简单地说,保留AlertDialog的一个字段,如果该字段不为null,并且您收到了调用,那么您将关闭该对话框。甚至可以将其用作触发点,并在关闭对话框之前执行相同的检查
answersque.getCount(objInterviewQuestion.getQid())>0
。这是关于你如何使用工具,而不是工具不起作用。祝您的编码顺利。实际上,这取决于
服务何时发送广播以及
广播接收器如何使用广播。例如,若服务在完成队列中的一个任务时发送广播,那个么若广播接收器,那个么您应该选中
answersquee.getCount(objInterviewQuestion.getQid())
,若它为0,并且显示了您的对话框,那个么您就调用dismise。如果没有,请等待下一个通知,甚至更新显示剩余数量的对话框。