如何在javafx中暂停和恢复下载

时间:2015-06-09 18:33:09

标签: url download javafx executorservice resume

我正在javafx

中构建一个下载管理器

我添加了下载按钮的功能,初始化新任务。多个下载也正在正常执行。

我需要添加暂停和恢复功能。请告诉我们如何使用执行器来实现它。通过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;
    }

}

1 个答案:

答案 0 :(得分:0)

您可能对Concurrency in JavaFX感兴趣。

我想你也应该看一下模式Observer

顺便说一下,我认为你不应该使用常量字符串作为状态(&#34;正在下载&#34;等),创建枚举将是一种更好的方法。

在循环中,在读/写部分周围,应该有一个同步机制,由暂停/恢复按钮控制(参见两个链接)。