如何在javafx中唯一标识每个任务?

时间:2017-10-16 05:50:17

标签: java javafx concurrency task

我有一个包含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";*/});
  });
}

1 个答案:

答案 0 :(得分:1)

列表单元与基础列表不存在一对一的关系。只有足够的listcells实例化以填充listview的视口加上一些额外的。通过updateCell方法将数据交换进listcells。

因此,您无法在列表单元格中存储数据,因为如果滚动列表,单元格将重新用于其他列表项目。

您需要做的是在基础列表项中存储对任务的引用。修改updateCell方法,将listcell中进度条的可见性和值绑定到任务进度属性。