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

问题描述 投票:0回答:1

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

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;
            }
        };
    }
}
java mysql javafx service
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);
}
© www.soinside.com 2019 - 2024. All rights reserved.