バックグラウンドでタスクを動かしている状態でJavaFXの画面を閉じる。
すると、裏で走っていたTaskが終わった後もなんか生き残っている。
環境は1.7.0_45に入っているjfxrt.jarでEclipse実行。
ソースは下の感じ。
@FXML
private void handleExecAction(ActionEvent event) {
this.logger.info("start");
try {
analizeTask = getAnalizeTask();
pgBar.progressProperty().unbind();
pgBar.progressProperty().bind(analizeTask.progressProperty());
pgLabel.textProperty().bind(analizeTask.messageProperty());
final ExecutorService exe = Executors.newSingleThreadExecutor();
exe.submit(analizeTask);
private Task<String> getAnalizeTask() {
return new Task<String>() {
@Override
protected String call() throws Exception {
logger.info("start");
try {
とりあえずは、
- Applicationクラスにコントローラー持たしておいて
- stopメソッドからコントローラーの終了メソッドを呼んで
- その中からTaskのcancel呼んで
- Taskのキャンセルイベントのハンドラー内で強制終了かけてやる
で回避。
Task内の終了処理をきちんとやろうとするといろいろはまりそうですが。
1
private FXMLController controller;
@Override
public void start(Stage stage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/Scene.fxml"));
Parent root = (Parent) fxmlLoader.load();
controller = (FXMLController) fxmlLoader.getController();
2
@Override
public void stop() throws Exception {
controller.destroy();
}
3
public class FXMLController implements Initializable {
public void destroy() {
if (analizeTask != null)
analizeTask.cancel();
}
4
analizeTask.addEventHandler(WorkerStateEvent.WORKER_STATE_CANCELLED,
new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
exe.shutdown();
}
});

