2017-07-13 31 views
0

目前,我有一個執行任務的程序(一個文件被導入)。在執行時,會彈出一個對話框,顯示ProgressBar的進度。該對話框包含一個「取消」按鈕,可在按下時取消該任務的執行。但是如果我再次啓動任務(我試圖在取消最後一次導入後再次導入文件),不僅任務開始,而且最後一個任務我取消了連續。我不知道這是否對文件的輸出有任何影響,但我仍然想知道:我可以完全終止一個任務嗎?JavaFX - 我可以完全終止一個任務嗎?

Task<Void> task = new Task<Void>() {    
      @Override 
      protected Void call() throws Exception { 
       if(chat.getName().contains("KakaoTalk_")) { 
        String s = ""; 
        String gesamt = ""; 
        double laenge = 0; 
        try(BufferedReader brCount = new BufferedReader(new FileReader(chat))) { 
         while((s=brCount.readLine())!=null) { 
          laenge++; 
          if(isCancelled()) { 
           break; 
          } 
         } 
        } catch (IOException e) { 
         System.out.println("Fehler beim zählen"); 
        } 
        double berechneLaenge = 0; 
        double berechneProzentLaenge = 0; 
        try(BufferedReader brCount = new BufferedReader(new FileReader(chat))) { 
         while((s=brCount.readLine())!=null) { 
          if(isCancelled()) { 
           break; 
          } 
          berechneLaenge++; 
          berechneProzentLaenge = (berechneLaenge/laenge)*100; 
          prozentOderSo.set(String.valueOf((int)berechneProzentLaenge)); 
         } 
        } catch (IOException e) { 
         System.out.println("Fehler beim zählen"); 
        } 
        double momentanErreicht = 0; 
        try(BufferedReader br = new BufferedReader(new FileReader(chat))) { 
         while((s=br.readLine())!=null) { 
          momentanErreicht++; 
          updateProgress(momentanErreicht, laenge); 
          int p = (int)((momentanErreicht/laenge)*100); 
          prozentImported.set(p); 
          s = s.replace("ß", "ß"); 
          s = s.replace("ö", "ö"); 
          s = s.replace("ü", "ü"); 
          s = s.replace("ä", "ä"); 
          s = s.replace("Ä", "Ä"); 
          s = s.replace("Ãœ", "Ü"); 
          s = s.replace("Ö", "Ö"); 
          gesamt += s+"\n"; 
         } 
        } catch (FileNotFoundException e1) { 
         System.out.println("File not found"); 
        } catch (IOException e2) { 
         System.out.println("IOException"); 
        } 
        mp.eingabeSetText(gesamt); 
        setChat(mp.eingabeGetText()); 
        getChat(); 
       } else mp.mhNichtPassendesFile(); 
       return null; 
      } 
     }; 
     mp.progressP().bind(task.progressProperty()); 
     mp.startFortschrittDialog(); 
     task.setOnFailed(mteh); 
     Thread th = new Thread(task); 
     th.setDaemon(true); 
     this.task = task; 
     th.start(); 
} 

回答

0

您不能終止任務。您只能取消它,並檢查此任務是否被方法isCancelled()取消。

讓我引用文檔:

檢查isCancelled()循環體是至關重要的,否則開發者可以取消任務,但任務將繼續運行和更新俱進,返回來自調用方法結尾的錯誤結果。任務的正確執行將始終檢查取消。

+0

所以,感謝您的解釋,但我如何確保任務不會繼續運行?我把當前的代碼放在問題中。 – Korlimann

+0

我想,你可以用'isAlive()'方法檢查你的線程狀態。 –

+0

@Korlimann你確實看到了第一句引用的句子,是嗎? 「在循環體中檢查isCancelled()是至關重要的,否則開發人員可能會取消該任務,但該任務將繼續運行......」在循環中檢查isCancelled()。 – VGR

相關問題