我有一个包含URL的ListView。当用户单击其中一个URL时,将下载视频。我在一个Task中调用视频下载功能,而Task又在一个Thread中调用。用户可以单击多个视频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";*/});
});
}
答案 0 :(得分:1)
列表单元与基础列表不存在一对一的关系。只有足够的listcells实例化以填充listview的视口加上一些额外的。通过updateCell方法将数据交换进listcells。
因此,您无法在列表单元格中存储数据,因为如果滚动列表,单元格将重新用于其他列表项目。
您需要做的是在基础列表项中存储对任务的引用。修改updateCell方法,将listcell中进度条的可见性和值绑定到任务进度属性。