2016-03-02 79 views
1

我正在使用Task进行网络调用的JavaFX项目。不幸的是,我一直无法找到我可以如何传递参数。我搜索了很多链接,但没有一个提供。一个来自java2s的链接宣称他们正在通过,但代码并不反映这一点。JavaFX:为任务提供参数

正如您从下面的代码可以看到的,我正在使用for-loop并在URL中传递RestGroupAccount的ID参数。这一次没关系,因为我反正需要所有的RestCanvas。

但我想知道如何给参数任务

代码:

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; 
    } 
}; 

如果需要更多的信息,请让我知道。谢谢。

+2

如果您需要多次使用“Task”中的代码,您应该考虑创建非匿名子类,并在每次需要时使用构造参数实例化它,或者使用mutable参数创建一次。 –

+1

@DmitryGinzburg由于'Task'旨在用于用户定义的线程,因此使用可变数据几乎总是一个错误,因为它会导致竞争条件。第一种方法是做到这一点,传递给构造函数的参数是不可变对象。 –

+0

@DmitryGinzburg:当我在Task中创建一个构造函数时,它期望返回类型,这意味着它不知道构造函数。 –

回答

3

如果您需要不止一次地在您的任务中使用代码,您应该考虑创建非匿名子类,并在您每次需要时使用构造参数对其进行实例化。

在您的例子,这可能是:

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; 
    } 
} 
+0

我只是试着按照你的建议传递参数,调用方法没有执行,没有网络调用。这是pastebin中的代码..http://pastebin.com/dKnQPLWJ –

+0

@WeareBorg你实际上并没有执行任务。 –

1

我也有类似的需要,在这里我需要创造条件,采取在文件中并在其上执行任务的任务。在我来说,我需要做不同的事情,在多个地方的文件,所以我创建了以下类:

public abstract class FileOperationTask<V> extends Task<V> { 
    protected File file; 

    public FileOperationTask(File file) { 
     this.file = 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(); 

,你可以请参阅,我可以在File对象上进行操作,并且实现异步任务现在与执行常规任务几乎完全相同。

+0

正是我需要的,谢谢! – Jim