【发布时间】:2016-03-02 14:05:59
【问题描述】:
我正在开发一个 JavaFX 项目,在该项目中我使用 Task 进行网络调用。不幸的是,我无法找到如何将参数传递给它。我搜索了很多链接,但没有一个提供。 java2s 的一个链接声称它们正在传递,但代码并未反映这一点。
从下面的代码可以看出,我使用了一个 for 循环,并在 URL 中传递了 RestGroupAccount 的 ID 参数。这次没关系,因为无论如何我都需要所有的 RestCanvas。
但我有兴趣知道如何为 Task 提供参数
代码:
private Task<List<RestCanvas>> fetchCanvases = new Task<List<RestCanvas>>() {
@Override
protected List<RestCanvas> call() throws Exception {
List<RestCanvas> list = new ArrayList<>();
try{
for(RestGroupAccount groupAccount : groupAccounts) {
RestTemplate rest = StaticRestTemplate.getRest();
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Cookie", "JSESSIONID=" + StaticRestTemplate.jsessionid);
HttpEntity<RestCanvas> requestEntity = new HttpEntity<>(requestHeaders);
rest.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
rest.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
ResponseEntity<RestCanvas[]> responseEntity = rest.exchange(getCanvasForGroupAccount+groupAccount.getGroupId(), HttpMethod.GET, requestEntity, RestCanvas[].class);
RestCanvas[] restCanvasArray = responseEntity.getBody();
Collections.addAll(list, restCanvasArray);
}
}catch (Exception e){
e.printStackTrace();
}
return list;
}
};
如果需要更多信息,请告诉我。谢谢你。
【问题讨论】:
-
如果您需要多次使用
Task中的代码,您应该考虑创建非匿名子类,并在每次需要时使用构造参数实例化它,或者创建一次使用可变参数。 -
@DmitryGinzburg 由于
Task旨在用于用户定义的线程,使用可变数据几乎总是错误的,因为它会导致竞争条件。第一种方法是这样做的,传递给构造函数的参数是不可变对象。 -
@DmitryGinzburg :当我在 Task 中创建构造函数时,它需要一个返回类型,这意味着它不知道构造函数。
-
@James_D 是的,当然,很难不同意,尽管无法编辑之前的评论。
-
@WeareBorg “预期返回类型”是什么意思?展示你想要做什么。