У меня немного странная проблема, и, к сожалению, я не могу написать отдельный класс для нее.В моем приложении у меня есть 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();