JavaFX:为任务提供参数
我正在从事一个JavaFX项目,在这个项目中,我正在与您进行网络通话。不幸的是,我无法找到如何向它传递参数。我搜索了很多链接,但没有一个提供。来自java2s的一个链接声称它们正在传递,但代码没有反映这一点 从下面的代码中可以看到,我使用for循环并在URL中传递RestGroupAccount的ID参数。这次没关系,因为我需要所有的RestCanvas 但我想知道如何为任务指定参数 代码:JavaFX:为任务提供参数,java,javafx,task,Java,Javafx,Task,我正在从事一个JavaFX项目,在这个项目中,我正在与您进行网络通话。不幸的是,我无法找到如何向它传递参数。我搜索了很多链接,但没有一个提供。来自java2s的一个链接声称它们正在传递,但代码没有反映这一点 从下面的代码中可以看到,我使用for循环并在URL中传递RestGroupAccount的ID参数。这次没关系,因为我需要所有的RestCanvas 但我想知道如何为任务指定参数 代码: private Task<List<RestCanvas>> fetchCanv
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;
}
};
private Task fetchCanvases=new Task(){
@凌驾
受保护的列表调用()引发异常{
列表=新的ArrayList();
试一试{
对于(RestGroupAccount groupAccount:groupAccounts){
RestTemplate rest=StaticRestTemplate.getRest();
HttpHeaders requestHeaders=新的HttpHeaders();
添加(“Cookie”、“JSSessionId=“+StaticRestTemplate.jsSessionId”);
HttpEntity requestEntity=新的HttpEntity(requestHeaders);
添加(新的MappingJackson2HttpMessageConverter());
添加(新的MappingJackson2HttpMessageConverter());
ResponseEntity ResponseEntity=rest.exchange(getCanvasForGroupAccount+groupAccount.getGroupId(),HttpMethod.GET,requestEntity,RestCanvas[].class);
RestCanvas[]restCanvasArray=responseEntity.getBody();
Collections.addAll(list,restCanvasArray);
}
}捕获(例外e){
e、 printStackTrace();
}
退货清单;
}
};
如果需要更多信息,请告诉我。多谢各位 > P>如果您需要多次使用您的任务中的代码,则应考虑创建非匿名子类,并在每次需要使用构造参数时实例化它。 在您的示例中,这可能是:
private Task<List<RestCanvas>> fetchCanvases = new MyTask(getCanvasForGroupAccount + groupAccount.getGroupId());
// ...
// please don't use this name :)
private static class MyTask extends Task<List<RestCanvas>> {
private final String id;
public MyTask(String id) {
this.id = id;
}
@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(id, HttpMethod.GET, requestEntity, RestCanvas[].class);
RestCanvas[] restCanvasArray = responseEntity.getBody();
Collections.addAll(list, restCanvasArray);
}
}catch (Exception e){
e.printStackTrace();
}
return list;
}
}
private Task fetchCanvases=new MyTask(getCanvasForGroupAccount+groupAccount.getGroupId());
// ...
//请不要使用此名称:)
私有静态类MyTask扩展了Task{
私有最终字符串id;
公共MyTask(字符串id){
this.id=id;
}
@凌驾
受保护的列表调用()引发异常{
列表=新的ArrayList();
试一试{
对于(RestGroupAccount groupAccount:groupAccounts){
RestTemplate rest=StaticRestTemplate.getRest();
HttpHeaders requestHeaders=新的HttpHeaders();
添加(“Cookie”、“JSSessionId=“+StaticRestTemplate.jsSessionId”);
HttpEntity requestEntity=新的HttpEntity(requestHeaders);
添加(新的MappingJackson2HttpMessageConverter());
添加(新的MappingJackson2HttpMessageConverter());
ResponseEntity ResponseEntity=rest.exchange(id,HttpMethod.GET,requestEntity,RestCanvas[].class);
RestCanvas[]restCanvasArray=responseEntity.getBody();
Collections.addAll(list,restCanvasArray);
}
}捕获(例外e){
e、 printStackTrace();
}
退货清单;
}
}
我也有类似的需求,我需要创建可以接收文件并在其上执行任务的任务。在我的例子中,我需要对多个位置的文件执行不同的操作,因此我创建了以下类:
public abstract class FileOperationTask<V> extends Task<V> {
protected File file;
public FileOperationTask(File file) {
this.file = file;
}
}
公共抽象类FileOperationTask扩展任务{
受保护的文件;
公共文件操作任务(文件){
this.file=文件;
}
}
这允许我在控制器中定义以下内容:
FileOperationTask<List<RaffleTicket>> task = new FileOperationTask<List<RaffleTicket>>(file){
@Override
protected List<RaffleTicket> call() throws Exception {
this.file.toString();
return null;
}
};
new Thread(task).run();
FileOperationTask任务=新建FileOperationTask(文件){
@凌驾
受保护的列表调用()引发异常{
this.file.toString();
返回null;
}
};
新线程(任务).run();
如您所见,我可以对文件对象进行操作,现在实现异步任务与实现普通任务大致相同。如果需要多次使用
任务中的代码,您应该考虑创建非匿名子类,并在每次需要使用构造参数时实例化它,或者用可变的PARAM创建它一次。@ DmitryGinzburg因为代码“>任务<代码>打算用于用户定义的线程,使用可变数据几乎总是错误的,因为它导致竞争条件。第一种方法是这样做的,传递给构造函数的参数是不可变对象。@DmitryGinzburg:当我在任务中创建构造函数时,它需要返回类型,这意味着它不知道构造函数。@James_D是的,当然,很难不同意,尽管上一条注释无法编辑。@WeareBorg“预期返回类型”是什么意思?我只是试着按照你建议的方式传递参数,调用方法没有执行,没有网络调用。这是pastebin中的代码@WeareBorg您实际上并没有执行任务。