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