首页 > 解决方案 > 停止 UI 方法,直到异步任务完成

问题描述

对不起我英语不好。

我正在搞乱需要做 UI 工作的 java 类。但 UI 工作需要等待异步任务。asyncTask 从 Internet 检索 api soap。检索到 api 后,它将设置为全局 jsonResponseBody。然后 UI-method 使用 jsonResponseBody 来做 UI-stuff。

在我现在的代码中,我使用 while-loop 在 jsonResponseBody 准备好之前停止继续。while-loop 对我来说是最好的主意吗?我想也许while-loop会减慢主线程,不是吗?

    //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

标签: javaasynchronous

解决方案


在 Java 中执行异步任务时,有几种方法可以处理输出。您发现的一种方法是使用循环来阻止代码执行,直到任务完成。我个人喜欢使用线程池和 Future 对象来等待我的线程完成。这两种方法都有一些优点和缺点,但是在你的情况下,你的 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

推荐阅读