有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

在我的第一个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;
            }
        };
    }
}

共 (1) 个答案

  1. # 1 楼答案

    代码中的问题是,服务方法是异步执行的

    您应该返回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);
    }