Cat*_*tch 4 concurrency asynchronous javafx runnable
我在Controller类中进行了一些操作可能需要一些时间.所以我想在此操作运行时显示加载对话框.
我试过这个:
Platform.runLater(new Runnable() {
@Override
public void run() {
loadingDialog.show();
}
});
Boolean opSuccess = myService.operate();
Platform.runLater(new Runnable() {
@Override
public void run() {
loadingDialog.hide();
}
});
if (opSuccess) {
// continue
}
Run Code Online (Sandbox Code Playgroud)
现在,问题是,loadingDialog永远不会显示.UI只会阻塞一段时间,而不是继续"//继续".
看来,阻塞操作(操作)阻止了runLater调用?
我还尝试了CoundDownLatch,等待loadDialog.show()完成,然后再运行myService.operate().但latch.await()方法永远不会完成.
所以我的问题是,在myService.operate()完成并返回true或false之前,我如何显示loadingDialog?我是否必须将operate()调用放入另一个线程并运行异步或是否有更简单的方法?
感谢帮助.
gfk*_*kri 15
您确定您的整个代码不能在JavaFX线程中运行吗?您的控制器类的方法通常会这样做,我会根据您的描述来假设它.
但是,最好使用Task类.在这里,您将找到适合您的应用程序的教程和简短代码段:
// here runs the JavaFX thread
// Boolean as generic parameter since you want to return it
Task<Boolean> task = new Task<Boolean>() {
@Override public Boolean call() {
// do your operation in here
return myService.operate();
}
};
task.setOnRunning((e) -> loadingDialog.show());
task.setOnSucceeded((e) -> {
loadingDialog.hide();
Boolean returnValue = task.get();
// process return value again in JavaFX thread
});
task.setOnFailed((e) -> {
// eventual error handling by catching exceptions from task.get()
});
new Thread(task).start();
Run Code Online (Sandbox Code Playgroud)
我假设Java 8和使用Lambda表达式的可能性.当然没有它们是可能的.