在我的第一个 Java 项目中,我似乎无法解决这个可能是基本的问题:在 JavaFX
应用程序中,我有一个 DAO
类,它启动一个 service
从 mysql
数据库获取值,从中构建一个对象并将该对象返回给调用者。但该对象永远不会被构建,因为返回发生在服务成功之前。
public IQA getQA(int id) throws SQLException {
try {
GetQuizService getQuizService = new GetQuizService();
getQuizService.restart();
getQuizService.setId(id);
getQuizService.setOnSucceeded(e -> {
this.quiz = getQuizService.getValue();
});
} catch (Exception e) {
System.err.println(e);
}
return quiz;
}
服务工作正常,在 onSucceeded 操作中存在对象,但是如何让返回等待服务完成?
根据要求,这里是 GetQuizService 的最小版本
public class GetQuizService extends Service<Quiz> {
private int id;
private Quiz quiz;
public void setId(int id) {
this.id = id;
}
@Override
protected Task<Quiz> createTask() {
return new Task<Quiz>() {
@Override
protected Quiz call() throws Exception {
// Severall calls to db here, Quiz object gets constructed
return quiz;
}
};
}
}
最佳答案
代码中的问题是,您的服务方法是异步执行的。
您应该返回Task<Quiz>
而不是quiz
如果收到结果,则使用它来更新您的前端(我需要很少的信息来为您创建合适的示例)。
另一种选择是将回调传递给您的服务,该回调在收到结果时调用,而不是返回测验。
public void getQA(int id, QuizReceiver callback) throws SQLException {
try {
GetQuizService getQuizService = new GetQuizService();
getQuizService.restart();
getQuizService.setId(id);
getQuizService.setOnSucceeded(e -> {
callback.quizReceived(getQuizService.getValue());
});
} catch (Exception e) {
System.err.println(e);
}
return quiz;
}
public interface OuizReceiver {
void quizReceived(IQA quiz);
}
关于java - 如何在调用方返回数据之前等待 JavaFX 服务完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55089713/