java - 停止 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
解决方案
在 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
推荐阅读
- ruby-on-rails - 当用户以条带续订订阅时,是否可以提高价格?
- javascript - 在 iframe 中加载 jquery
- java - java.lang.RuntimeException: java.lang.NullPointerException
- java - 关于 Java 中 LockSupport.getBlocker(Thread t) 的一个问题
- vba - 在 Access 中为多个 Excel 文件导入添加字段文件路径
- simulation - 如何将两个不同代理的运行与多个运行组合在一起
- python - 为什么我使用 python 将元素插入到没有分行器的 xml 文件中?
- r - 事后成对
- gnuplot - 如何避免使用带线图中的累积 y 值绘制非连续时间序列值
- google-apps-script - Google Apps 脚本或公式对输入单元格的时间执行数据验证