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