Просмотр не будет обновляться с помощью ScheduledExecutorService - PullRequest
2 голосов
/ 27 апреля 2019

У меня возникли проблемы с работой ScheduledExecutorService.

Это метод, который я вызываю, который работает , если я вызываю его без планирования.

Однако, если я вызываю его через ScheduledExecutorService, мой экран не обновляется, он также запускается только один раз, поэтому я предполагаю, что генерируется исключение, но я не вижу исключения ни на сервере, ни на клиенте.

private void getNextRoundFromServer() throws IOException{
    try{
        if(!this.connected) return;
        this.dos.writeByte(2);
        this.dos.flush(); // Send data
        this.grid = (Grid) this.ois.readObject(); //i have checked, i do recieve this object
        setMainPane(render.render(this.grid)); //this renders the view
    } catch(ClassNotFoundException ex){
        ex.printStackTrace();
    }
}

Вот как я делаю свою реализацию.

continuousPlayButton.setOnMouseClicked(e -> {
    try{
        Runnable scheduledRound = () -> {
            try {
                getNextRoundFromServer();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        };
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        scheduler.scheduleAtFixedRate(scheduledRound, 1, 5, TimeUnit.SECONDS);
    }catch(Exception ex){
        ex.printStackTrace();
    }
});

Почему мой вид не обновляется?

Обновление

Решение:

Как упомянуто пользователем tjanu: я забыл позвонить Platform.runLater по запланированному заданию. Что я уже сделал, когда позвонил без планирования ... 10

Ответы [ 3 ]

2 голосов
/ 27 апреля 2019

Вам необходимо выполнить обновления пользовательского интерфейса в потоке приложения JavaFX.

Это то, для чего Platform :: runLater предназначен.

- редактировать По запросу,для этого кода необходимо изменить:

private void getNextRoundFromServer() throws IOException{
    try{
        if(!this.connected) return;
        this.dos.writeByte(2);
        this.dos.flush(); // Send data
        this.grid = (Grid) this.ois.readObject(); //i have checked, i do recieve this object
        // This is the needed change
        Platform.runLater(() -> setMainPane(render.render(this.grid))); //this renders the view
    } catch(ClassNotFoundException ex){
        ex.printStackTrace();
    }
}
0 голосов
/ 27 апреля 2019

Вы ссылаетесь на переменные экземпляра в своем методе getNextRoundFromServer (), и теперь вы вызываете метод из нового (анонимного) экземпляра Runnable, поэтому ваши ссылки на «this» могут не совпадать с тем, где вы думаете, что ониresolving.

Возможно, передать ссылку на исходный экземпляр?

private void getNextRoundFromServer(YourObjectClass instance) throws IOException{
    try{
        if(!instance.connected) return;
        instance.dos.writeByte(2);
        instance.dos.flush(); // Send data
        instance.grid = (Grid) instance.ois.readObject(); //i have checked, i do recieve this object
        setMainPane(render.render(instance.grid)); //this renders the view
    } catch(ClassNotFoundException ex){
        ex.printStackTrace();
    }
}


continuousPlayButton.setOnMouseClicked(e -> {
    try {
        final instanceRef = getReferenceToYourOriginalInstance();  
        Runnable scheduledRound = () -> {
            try {
                getNextRoundFromServer( instanceRef );
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        };
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        scheduler.scheduleAtFixedRate(scheduledRound, 1, 5, TimeUnit.SECONDS);
    }catch(Exception ex){
        ex.printStackTrace();
    }
});
0 голосов
/ 27 апреля 2019

Не полный ответ на ваш вопрос, но предложение. Возможно, вы можете попытаться переопределить метод run ().

Runnable scheduledRound = new Runnable() {
    @Override
    public void run() {
        try {
            getNextRoundFromServer();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...