2015-06-09 4 views
1

Я строю менеджер загрузки в JavaFXКак приостановить и возобновить загрузку в JavaFX

Я добавил функцию, чтобы загрузить кнопку, которая инициализирует новый task.More, чем одна загрузка также выполняется должным образом.

Но Мне нужно добавить функцию паузы и возобновления. Расскажите, как реализовать его с помощью исполнителя. Через функцию выполнения Executors запускается задача, но как сделать паузу &, а затем возобновить ее?

Ниже я показываю соответствующие части моего кода. Пожалуйста, сообщите, если вам нужна дополнительная информация. Благодарю.

Основной класс

public class Controller implements Initializable { 

    public Button addDownloadButton; 
    public Button pauseResumeButton; 
    public TextField urlTextBox; 
    public TableView<DownloadEntry> downloadsTable; 
    ExecutorService executor; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

     // here tableview and table columns are initialised and cellValueFactory is set 

     executor = Executors.newFixedThreadPool(4); 
    } 

    public void addDownloadButtonClicked() { 
     DownloadEntry task = new DownloadEntry(new URL(urlTextBox.getText())); 
     downloadsTable.getItems().add(task); 
     executor.execute(task); 
    } 


    public void pauseResumeButtonClicked() { 
     //CODE FOR PAUSE AND RESUME 
    } 
} 

DownloadEntry.java

public class DownloadEntry extends Task<Void> { 

    public URL url; 
    public int downloaded; 
    final int MAX_BUFFER_SIZE=50*1024; 
    private String status; 

    //Constructor 
    public DownloadEntry(URL ur) throws Exception{ 
     url = ur; 
     //other variables are initialised here 
     this.updateMessage("Downloading"); 
    } 

    @Override 
    protected Void call() { 
     file = new RandomAccessFile(filename, "rw"); 
     file.seek(downloaded); 
     stream = con.getInputStream(); 

     while (status.equals("Downloading")) { 
      byte buffer=new byte[MAX_BUFFER_SIZE]; 

      int c=stream.read(buffer); 
      if (c==-1){ 
       break; 
      } 
      file.write(buffer,0,c); 
      downloaded += c; 
      status = "Downloading"; 
     } 
     if (status.equals("Downloading")) { 
      status = "Complete"; 
      updateMessage("Complete"); 
     } 
     return null; 
    } 

} 

ответ

0

Вы можете быть заинтересованы в Concurrency in JavaFX.

Я думаю, вы также должны взглянуть на рисунок Observer.

Кстати, я думаю, что вы не должны использовать постоянную строку как статус («Загрузка» и т. Д.), Создание переименования было бы лучшим подходом.

В вашей петле вокруг части чтения/записи должен быть механизм синхронизации, управляемый кнопками паузы/возобновления (см. Две ссылки).

+0

Я изменил сравнение со строкой. Но я просмотрел ваши ссылки, и они, похоже, не помогают мне. Ничего не упоминается в первой ссылке о том, как выполнить задачу. –

+0

Как доказательство концепции, вы можете добавить в свой DownloadEntry изменчивый логический атрибут «isPaused» и проверить его состояние сразу после создания буфера в цикле while. Если атрибут «isPaused» равен true, вы пропустите шаг чтения/записи. Кроме того, вам нужен сеттер (для isPause), который вы будете использовать в своих паузах и кнопках возобновления. Но я думаю, что вы хотите иметь возможность приостанавливать/возобновлять все записи одновременно. Вот почему я думал о шаблоне Observer (ваш DownloadEntry должен ожидать любое событие паузы/возобновления). – VinceOPS

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