Javafx 从数据库获取数据
我想从数据库中获取JavaFX应用程序中的数据。但在此期间,应用程序冻结Javafx 从数据库获取数据,javafx,javafx-2,javafx-8,Javafx,Javafx 2,Javafx 8,我想从数据库中获取JavaFX应用程序中的数据。但在此期间,应用程序冻结 Map<String, List<DataObj>> dbData = ConnectedAgents.generateDataObj(ac); Map dbData=connectedagent.generateDataObj(ac); 我测试了这段代码,第一眼看上去不错。但这是beast进行后台数据库操作的方式吗 Platform.runLater(new Runnable()
Map<String, List<DataObj>> dbData = ConnectedAgents.generateDataObj(ac);
Map dbData=connectedagent.generateDataObj(ac);
我测试了这段代码,第一眼看上去不错。但这是beast进行后台数据库操作的方式吗
Platform.runLater(new Runnable()
{
@Override
public void run()
{
Map<String, List<DataObj>> dbData = ConnectedAgents.generateDataObj(ac);
}
});
Platform.runLater(新的Runnable()
{
@凌驾
公开募捐
{
Map dbData=connectedagent.generateDataObj(ac);
}
});
您能告诉我在JavaFX中执行数据库操作的最佳方法是什么吗?平台。runLater(…)
不会在后台线程中运行。实际上,它的作用完全相反:它在FX应用程序线程上执行提供的Runnable
的run()
方法。您可以使用Platform.runLater(…)
根据后台线程上运行的代码来更新UI,但通常有更好的方法
在这里,你应该使用一种方法来实现你想要的
final Task<Map<String, List<DataObj>>> dataGenerationTask = new Task<Map<String, List<DataObj>>>() {
@Override
public Map<String, List<DataObj>> call() throws Exception {
return ConnectedAgents.generateDataObj(ac);
}
};
dataGenerationTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
Map<String, List<DataObj>> dbData = dataGenerationTask.getValue();
// you can safely update the UI with the dbData here....
}
});
dataGenerationTask.setOnFailed(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
Throwable t = dataGenerationTask.getException();
// handle errors here, if needed
}
});
Thread thread = new Thread(dataGenerationTask);
thread.setDaemon(true); // this thread won't prevent shutdown of the application
thread.start();
final Task dataGenerationTask=新任务(){
@凌驾
公共映射调用()引发异常{
返回连接的试剂。生成的试剂(ac);
}
};
dataGenerationTask.setOnSucceeded(新的EventHandler(){
@凌驾
公共无效句柄(WorkerStateEvent事件){
Map dbData=dataGenerationTask.getValue();
//您可以在此处使用dbData安全地更新UI。。。。
}
});
dataGenerationTask.setOnFailed(新的EventHandler(){
@凌驾
公共无效句柄(WorkerStateEvent事件){
Throwable t=dataGenerationTask.getException();
//如果需要,请在此处处理错误
}
});
线程线程=新线程(dataGenerationTask);
thread.setDaemon(true);//此线程不会阻止关闭应用程序
thread.start();
通常任务完成时会发生什么?它是已销毁还是处于休眠状态?它将移动到“成功”状态(如果完成时出现异常,则为“失败”状态)。这是一项一次性任务,因此无法重新启动。显然,只要您让它超出范围,它就会以通常的方式收集垃圾。