JavaFX-服务任务并非始终运行

时间:2018-09-12 15:19:51

标签: javafx-8

我有一个奇怪的问题,不幸的是,这不是我可以轻松编写独立类的问题。 在我的应用程序中,我具有一个可单击的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();

0 个答案:

没有答案