我有一个tableview,其中包含一个对象列表,它从硬盘驱动器上的文件中提取元数据。
该列表很容易长达5000个项目,并且必须在硬盘驱动器数据发生变化时进行更新。如果用户提供了另外的目录来构建数据集,也可以更新它。简而言之,tableview上的数据可能会定期更新。
我目前有一个处理所有更新的线程。它结合使用了几种不同的技术(会话之间的持久性,FileWalker用于添加新数据,WatchService用于在会话期间监视更新)。不幸的是,这个线程不是JavaFX线程,所以当我更新支持TableView的ObservableList
时,我偶尔会得到一个ConcurrentModificationException
。
后台守护程序的基本形状是while ( true )
循环,因为它会轮询更新可能来自的各个位置,并做出相应的反应。
Platform.runLater()
无效似乎适用于此大型数据集。我尝试让后台线程保留要添加和删除的对象列表,然后通过阅读ObservableList
和addMe
列表请求javafx线程更新removeMe
,但是没有&# 39;工作 - 在大量读取数据期间停止调用runLater()
个线程,因此tableview不会更新6+分钟,直到后台线程读取完所有数据。只有在那之后才会最终调用runLater()。我通过检查一个更新请求是否已经挂起来避免调用不需要的runLater(),但是修剪请求的数量并没有对结果产生任何影响。
有没有办法在后台运行这样的持续运行的线程,并让它更新JavaFX UI的数据集?我觉得必须有某种方法来做到这一点,但我找不到任何可行的方法。