我有一个非常简单的JavaFX应用程序。在其中,我有一个Java对象来处理数据库活动,主要是执行查询。为了防止我的UI在查询执行时完全冻结,我使用javafx.concurrent.Service
实现了后台线程。这在我的connect方法上很有用,它不返回任何东西。但是,在我的查询方法中,它会立即跳转到返回行,当然返回null。然后它返回并运行查询,但它已经返回了一个空的arraylist。
我做错了什么?
这是我的方法:
public ArrayList<Foo> runQuery() throws SQLException {
ArrayList<Foo> result = new ArrayList<Foo>();
backgroundThread = new Service<Void>() {
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
protected Void call() throws Exception {
stmt = conn.createStatement();
String query = "Select stuff...
rs = stmt.executeQuery(query);
return null;
}
};
}
};
backgroundThread.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent argo) {
try {
while (rs.next()) {
result.add(new Foo(rs.getString(1)));
}
} catch (SQLException e) {
e.printStackTrace();
}
controller.addLogEntry("done.\n");
}
});
backgroundThread.restart();
return result;
}