【发布时间】:2017-10-16 05:50:17
【问题描述】:
我有一个包含 URL 的 ListView。当用户单击其中一个 URL 时,将下载视频。我在一个任务中调用视频下载功能,该任务又在一个线程中调用。用户可以单击多个视频 URL,视频将开始下载。将为每个视频创建一个单独的任务。我想知道的是如何唯一标识每个视频的任务?
视频下载功能:
public void videoFileDownload(){
try {
videoDownloadUrl = lblURL.getText().toString();
IndexOfThisNode = hbox.getId();
String path = "XXXX";
downloadThisVideo = new VGet(new URL(videoDownloadUrl),new File(path));
downloadThisVideo.download();
System.out.println("Download this video: " + videoDownloadUrl + downloadThisVideo.getVideo().getState());
System.out.println("Download complete");
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("Retrying...");
}
}
包含任务的函数:
public void showDetailsButton(){
btnSMDetails.addEventHandler(MouseEvent.MOUSE_CLICKED, (e)->{
System.out.println("\n" + "The index is: " + getIndex() + "\n");
showLoader();
//Task created to download videos in background without blocking UI
Task downloadVideoTask = new Task<Void>() {
@Override
public Void call() {
//SIMULATE A FILE DOWNLOAD
videoFileDownload();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
};
new Thread(downloadVideoTask).start();
downloadVideoTask.setOnSucceeded(taskFinishEvent ->{showLoader(); /*isButtonClicked="0";*/});
});
}
【问题讨论】:
-
这个问题似乎有点太宽泛了——你所说的识别任务是什么意思?据推测,每个
Task都必须有它下载的视频的 URL - 仅此一项就足够了。另一种方法是在创建时分配一个 ID,或者简单地使用引用相等。你想达到什么目的? -
@sillyfly 在下载视频时,列表单元被禁用并显示进度条。但是,当我一直向下滚动然后返回到该单元格时,它不再被禁用并且不显示进度条。所以,我想告诉 listcell 不要更新按下下载按钮的单元格。一位朋友告诉我,这可以使用 Task 和存储任务来实现
-
创建一个minimal reproducible example 来演示您要解决的实际问题。
标签: java javafx concurrency task