java - 如何在调用方返回数据之前等待 JavaFX 服务完成?

标签 java mysql javafx service

在我的第一个 Java 项目中,我似乎无法解决这个可能是基本的问题:在 JavaFX 应用程序中,我有一个 DAO 类,它启动一个 servicemysql 数据库获取值,从中构建一个对象并将该对象返回给调用者。但该对象永远不会被构建,因为返回发生在服务成功之前。

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/

相关文章:

java - 使用 Streaming API 转换 map 列表中的值

java - 在java中打印格式化字符串/字符数组

JavaFX 错误 : Controller value already specified

java - Gradle 测试执行器因非零退出值 1 而失败(IntelliJ Idea 默认 Gradle[7.4.1]/JavaFX[17.0.1] 版本)

java - 访问 JavaFx TableView/TableColumn 中的嵌套属性

Java - 通过参数传递方法

java - Aspose cells java,如何从表/ListObject创建图像

mysql - 需要解决查询问题的建议

java - Spring boot+Spring Security 单向 SSL 和双向 SSL 应用端点

mysql - Nodejs中从mySQL获取数据时如何获取Async/await函数的返回值