2016-03-02 3 views
1

Я работаю над проектом JavaFX, в котором я делаю сетевые вызовы с помощью Task. К сожалению, я не смог найти способ передать аргументы. Я искал много ссылок, но ни один из них не предоставляет. Одна ссылка из java2s утверждает, что они проходят, но код не отражает этого.JavaFX: аргументы снабжения для задачи

Как вы можете видеть из приведенного ниже кода, я использую for-loop и передаю параметр ID RestGroupAccount в URL-адресе. На этот раз все в порядке, потому что мне все равно нужен весь 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

Если вам нужно использовать код внутри своей «задачи» более одного раза, вам следует подумать о создании неанонимного подкласса и либо создавать его каждый раз, когда вам это нужно, с помощью параметра построения, либо создать его один раз с помощью изменяемого параметра. –

+1

@DmitryGinzburg Поскольку 'Задача' предназначена для использования в пользовательском потоке, использование изменчивых данных почти всегда является ошибкой, потому что это приводит к условиям гонки. Первый подход - это способ сделать это, при этом параметры передаются конструктору как неизменяемые объекты. –

+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

Смежные вопросы