Как ждать завершения работы службы JavaFX, прежде чем возвращать данные в вызывающую программу? - PullRequest
0 голосов
/ 10 марта 2019

Работая над моим первым проектом Java, я не могу обойти эту, вероятно, основную проблему: в приложении JavaFX у меня есть класс DAO, который запускает service для получения значений из mysqldb, строит из него объект и возвращает объект вызывающей стороне.Но объект никогда не получает сборку, потому что возвращение происходит до того, как служба преуспела.

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 голос
/ 11 марта 2019

Проблема в вашем коде в том, что ваши служебные методы выполняются асинхронно.

Вы должны вернуть 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...