【问题标题】:JavaFX : Supply arguments to TaskJavaFX:为任务提供参数
【发布时间】: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 “预期返回类型”是什么意思?展示你想要做什么。

标签: java javafx task


【解决方案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 对象进行操作,并且现在实现我的异步任务与实现普通任务或多或少相同。

【讨论】:

    【解决方案2】:

    如果您需要多次使用 Task 中的代码,则应考虑创建非匿名子类,并在每次需要时使用构造参数对其进行实例化。

    在您的示例中,这可能是:

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

    【讨论】:

    • 我只是按照你建议的方式传参,调用方法没有执行,没有网络调用。这是pastebin中的代码..pastebin.com/dKnQPLWJ
    • @WeareBorg 你实际上并没有执行任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2017-12-13
    相关资源
    最近更新 更多