Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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_Asynchronous - Fatal编程技术网

Java 停止UI方法,直到异步任务完成

Java 停止UI方法,直到异步任务完成,java,asynchronous,Java,Asynchronous,对不起,我英语不好 我正在摆弄一个需要做UI工作的java类。但是UI工作需要等待异步任务。asyncTask从internet检索api soap。一旦检索到api,它就被设置为全局jsonResponseBody。然后UI方法使用jsonResponseBody来完成UI工作 在我现在的代码中,我使用while循环在jsonResponseBody准备好之前停止前进。while loop对我来说是最好的主意吗?我想while循环可能会减慢主线程的速度,不是吗 //Pre-async

对不起,我英语不好

我正在摆弄一个需要做UI工作的java类。但是UI工作需要等待异步任务。asyncTask从internet检索api soap。一旦检索到api,它就被设置为全局jsonResponseBody。然后UI方法使用jsonResponseBody来完成UI工作

在我现在的代码中,我使用while循环在jsonResponseBody准备好之前停止前进。while loop对我来说是最好的主意吗?我想while循环可能会减慢主线程的速度,不是吗

    //Pre-async task stuff is run
    connectDbAsync(db,sqlQuery); //This will set jsonResponseBody sooner or later
    while(jsonResponseBody == null){
        //Do nothing, just wait
    }
    //Post-async task stuff which uses jsonResponseBody

你可以看看。您可以使用它异步启动一些代码,但您可以获得一个句柄,因此您可以检查它是否已完成(Future.isDone())或阻止,直到它完成:Future.get()

在Java中执行异步任务时,有几种方法可以处理输出。正如您所发现的,一种方法是使用循环阻止代码执行,直到任务完成。我个人喜欢使用线程池和将来的对象来等待线程完成。这两种方法都有一些优点和缺点,但是在您的情况下,while循环不应该减慢主线程的速度,因为它只在有限的时间内运行,并且在您开始执行异步任务后立即运行

这就是说,异步任务的好处是它可以在代码执行其他操作时执行自己的操作如果您必须等待异步任务完成,然后才能在方法中继续,那么该任务可以同步完成,而不需要循环来暂停执行。

在继续执行之前等待多个“站点”的网络轮询的示例阻止代码。这显示了异步任务/多线程在一次执行多个任务时的优势:

            //Invoke run method on each site simultaneously, store results in a list
            List<Future<Site>> futures=threadmaker.invokeAll(active_sites.stream().map(TAG_SCANNER::new).collect(Collectors.toList()));
        
            List<Site> alarm_sites = new ArrayList<>();
            //Now fetch all the results serially
            for(Future<Site> result: futures){
                //SOUND THE ALARMS
                alarm_sites.add(result.get());
            }
// Continue synchronous method execution
//在每个站点上同时调用run方法,将结果存储在列表中
List futures=threadmaker.invokeAll(active_sites.stream().map(TAG_SCANNER::new).collect(Collectors.toList());
列出报警站点=新建ArrayList();
//现在按顺序获取所有结果
for(未来结果:未来){
//拉响警报
alarm_sites.add(result.get());
}
//继续同步方法执行

通常,您希望在asyncTask运行时创建UI,然后在asyncRask完成时更新UI。什么类型的UI?摆动JavaFX?基于网络的?