JavaFX - не всегда выполняется задача службы - PullRequest
0 голосов
/ 12 сентября 2018

У меня немного странная проблема, и, к сожалению, я не могу написать отдельный класс для нее.В моем приложении у меня есть TableView (на вкладке), который можно кликать.При щелчке строки в этом табличном представлении открывается новая вкладка с данными, относящимися к нажатой строке в новом табличном представлении.TableViews связаны с пользовательским классом, который расширяет ModifiableObservableListBase.Это позволяет использовать полосу прокрутки для запроса новых данных с сервера на основе верхней и нижней строк окна просмотра.Это все хорошо работает.У меня также есть Сервис в моем подклассе ModifiableObservableListBase, который используется для улучшения рендеринга данных при высокой нагрузке.Он использует LinkedBlockingQueue и countDownLatch, так что только самый последний вид обновляется до пользовательского интерфейса, предотвращая ненужные перерисовки.Используя следующее:

 setAll(list);

Это также хорошо работает.

Пока все хорошо!

Я заметил, что когда я открываю и закрываю эти вкладки несколькораз (без фиксированного числа), в какой-то момент TableView перестанет обновляться данными.Данные запрашиваются с сервера и принимаются, но Служба, которая используется для управления способом добавления данных в ModifiableObservableListBase, не может выйти из состояния SCHEDULED.Это означает, что созданная задача никогда не запускается.Я изо всех сил пытаюсь понять, почему это будет работать правильно x раз, а затем перестанет работать.Любая помощь будет приветствоваться, извините, у меня нет отдельного приложения, которое повторяет эту проблему.Я попытаюсь воссоздать его.

Следующая Служба построена в конструкторе моего подкласса ModifiableObservableListBase, который создается каждый раз, когда новая вкладка (включая соответствующий TableView, который связан с ModifiableObservableListBase) добавляется кUI.

 Service upDateService = new Service() {
        @Override
        protected Task createTask() {
            //when the code fails it still calls to here.
            return new Task() {

                @Override
                protected Object call() throws Exception {
                    //when the code fails it doesn't call the call() method
                    while (true) {
                        List<T> list = updateQueue.take();
                        updateLatch = new CountDownLatch(1);
                        //now put on the FX Application Thread
                        Platform.runLater(() -> {
                            if (list.size() > 0 && list.get(0) instanceof TableStructure) {
                                totalRowCount.set(((TableStructure) list.get(0)).getTotalDbRowCount());
                            }

                            setAll(list);

                            updateLatch.countDown();
                        });

                        try {

                            updateLatch.await(1, TimeUnit.MINUTES);
                            updateLatch = null;
                        }
                        catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
            };
        }
    };
    upDateService.start();
...