【问题标题】:How to uniquely identify each Task in javafx?javafx中如何唯一标识每个Task?
【发布时间】: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


【解决方案1】:

列表单元不存在与基础列表的一对一关系。只有足够的列表单元被实例化来填充列表视图的视口以及一些额外的。通过 updateCell 方法将数据换入和换出 listcell。

因此,您不能将数据存储在 listcell 中,因为如果您滚动列表,该单元格将被重新用于另一个列表项。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    相关资源
    最近更新 更多