2017-10-16 12 views
-3

J'ai un ListView contenant des URL. Lorsqu'un utilisateur clique sur l'une des URL, une vidéo est téléchargée. J'appelle la fonction de téléchargement de vidéo dans une tâche qui à son tour est appelée dans un thread. Un utilisateur peut cliquer sur plusieurs URL de vidéo et la vidéo commencera à télécharger. Une tâche distincte sera créée pour chacune des vidéos. Ce que je veux savoir est comment identifier de manière unique la tâche pour chaque vidéo?Comment identifier de manière unique chaque tâche dans javafx?

Fonction pour télécharger la vidéo:

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..."); 
      } 
     } 

Fonction contenant Tâche:

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

La question semble un peu trop large - que voulez-vous dire par l'identification de la tâche? Vraisemblablement, chaque 'Task' doit avoir l'URL de la vidéo qu'il télécharge - cela seul peut être suffisant. Une autre méthode consiste à attribuer un ID lors de la création, ou simplement en utilisant l'égalité de référence. Qu'essayez-vous d'accomplir? – Itai

+0

@sillyfly Pendant le téléchargement de la vidéo, la cellule de liste est désactivée et la barre de progression est affichée. Cependant, lorsque je défile vers le bas et que je reviens dans cette cellule, il n'est plus désactivé et la barre de progression n'est pas affichée. Donc, je veux dire à la cellule de liste de ne pas mettre à jour la cellule dans laquelle le bouton de téléchargement est pressé. Un ami m'a dit que cela peut être réalisé en utilisant Tâche et en stockant la tâche –

+2

Créer un [MCVE] qui montre le problème que vous essayez de résoudre. –

Répondre

1

Listcells n'existent pas dans une relation biunivoque avec la liste sous-jacente. Il y a juste assez de listcells instanciées pour remplir la fenêtre d'affichage de la liste plus quelques autres. Les données sont permutées dans et hors des listcells via la méthode updateCell.

Vous ne pouvez donc pas stocker de données dans une cellule de liste, car la cellule sera réutilisée pour un autre élément de liste si vous faites défiler la liste.

Ce que vous devez faire est de stocker une référence à la tâche dans l'élément de liste sous-jacente. Modifiez votre méthode updateCell pour lier la visibilité et la valeur de votre barre de progression dans la propriété listcell à la propriété de progression de la tâche.