JavaFX:为任务提供参数

We *_*org 5 java javafx task

我正在开发一个 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

如果需要更多信息,请告诉我。谢谢你。

Bre*_*gan 6

我有一个类似的需求,我需要创建将接收文件并对其执行任务的任务。在我的例子中,我需要对多个地方的文件做不同的事情,所以我创建了以下类:

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

    public FileOperationTask(File file) {
        this.file = file;
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许我在我的控制器中定义以下内容:

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();
Run Code Online (Sandbox Code Playgroud)

如您所见,我能够对 File 对象进行操作,并且实现我的异步任务现在或多或少与实现普通任务相同。


Dmi*_*urg 5

如果您需要多次使用 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;
    }
}
Run Code Online (Sandbox Code Playgroud)