在JavaFX應用程序中,我有一種方法需要很長時間處理大量輸入。我在加載時打開一個對話框,我希望用戶能夠取消/關閉對話框,任務將退出。我創建了一個任務並在取消按鈕處理中添加了它的取消。但是取消不會發生,任務不會停止執行。JavaFX - 取消任務不起作用
Task<Void> task = new Task<Void>() {
@Override
public Void call() throws Exception {
// calling a function that does heavy calculations in another class
};
task.setOnSucceeded(e -> {
startButton.setDisable(false);
});
}
new Thread(task).start();
cancelButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
System.out.println("Button handled");
task.cancel();
}
);
爲什麼當按鈕被點擊時不會取消任務?
您必須處理取消執行中的任務。請閱讀[文檔](https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html)中示例前面的最後一段:「任務的用戶將要求它將被取消,並且任務的作者必須檢查是否在呼叫方法的主體內被取消。「 – Itai
@sillyfly是的,這很有用。但是,如果重大部分是在另一個類的函數中完成的,我該如何檢查任務的取消? –
這在很大程度上取決於其他類的實現。沒有「全面解決方案」的解決方案,但通常你或者有一個任務由很多較小的「步驟」組成,所以你可以在每次迭代中檢查一個標誌,或者你有某種形式的「等待」,它會響應到一個「中斷」。 – Itai