我有一个奇怪的问题,不幸的是,这不是我可以轻松编写独立类的问题。 在我的应用程序中,我具有一个可单击的TableView(在选项卡上)。单击此TableView中的一行将打开一个新的选项卡,其中包含与新TableView中单击的行有关的数据。 TableView绑定到扩展ModifiableObservableListBase的自定义类。这允许滚动条用于根据视口的顶部和底部行从服务器请求新数据。 这一切都很好。 我的ModifiableObservableListBase子类中也有一个Service,用于改善高负载下数据的呈现。它使用LinkedBlockingQueue和countDownLatch,以便仅将最新视图更新到UI,以防止不必要的重绘。使用以下内容:
setAll(list);
这也很好。
到目前为止一切顺利!
我注意到的是,当我多次打开和关闭这些选项卡(无固定数字)时,TableView有时会停止使用数据更新。从服务器请求并接收数据,但是用于控制如何将数据添加到ModifiableObservableListBase的服务无法移出SCHEDULED状态。这意味着已创建的任务永远不会运行。我正在努力查看为什么它会正确运行x次然后停止工作。 任何帮助都将受到真正的欢迎,对不起,我没有一个可重复此问题的独立应用程序。我将尝试重新创建它。
以下服务是在我的ModifiableObservableListBase子类的构造函数中构造的,该子类在每次将新标签(包括绑定到ModifiableObservableListBase的相应TableView)添加到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();