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()

我想从数据库中获取JavaFX应用程序中的数据。但在此期间,应用程序冻结

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();

通常任务完成时会发生什么?它是已销毁还是处于休眠状态?它将移动到“成功”状态(如果完成时出现异常,则为“失败”状态)。这是一项一次性任务,因此无法重新启动。显然,只要您让它超出范围,它就会以通常的方式收集垃圾。