我的目标是在返回CompletableFuture的方法中调用API,这样我的vaadin UI就不会冻结。
这是我到目前为止所做的事情。
API调用:
@Async
public CompletableFuture<List<Ownership>> getAllOwnerships() {
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Ownership[]> responseEntity = restTemplate.exchange(baseUrl, HttpMethod.GET, new HttpEntity<>(authentication.getHeaders()), Ownership[].class);
List<Ownership> ownerships = Arrays.asList(responseEntity.getBody());
return CompletableFuture.completedFuture(ownerships);
}
然后在我的服务层中,我有以下内容:
@Async
public List<Ownership> getAllOwnerships() {
if (ownerships.isEmpty()) {
getOwnershipsFromRemote();
}
return ownerships;
}
该类中该列表的ownerships
只是一个空的ArrayList(不是null!)。 ownerships
填充了getOwnershipsFromRemote()
:
private void getOwnershipsFromRemote() {
CompletableFuture<List<Ownership>> future = remoteOwnershipData.getAllOwnerships();
boolean breaker = false;
while (!breaker) {
if (future.isDone()) {
try {
this.ownerships = future.get();
breaker = true;
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
}
调用开始时看到的API调用方法。
现在,在我的Vaadin视图中,我试图做以下事情:
ownershipList = carService.getAllOwnerships();
ownershipListDataProvider = DataProvider.ofCollection(ownershipList);
但是在carService.getAllOwnerships()
调用之后,ownershipList为null,而不是我期望的空列表。我希望这个列表会在服务层的getOwnershipsFromRemote()
调用中填充,因为它填充了getAllOwnerships
返回的相同List。
不幸的是,空指针会中断对DataProvider.ofCollection
的调用。
如何在API调用完成后自动更新我的vaadin UI元素(本例中为网格)?最好不要执行while循环来检查是否在vaadin视图中完成CompletableFuture,因为这会阻止UI线程,这是我试图阻止的。
为了清楚起见;当我的视图中的列表更新(已经管理过这个)时,我没有尝试让我的UI自动更新,而是我正在寻找一种有效的方法将CompletableFuture中的数据导入List我的视图已经被观看了,没有用无限循环锁定UI线程。