【发布时间】:2019-06-28 23:36:14
【问题描述】:
我有一个ObservableList 的“曲目”显示在TableView 上。 ObservableList 的内容基于从磁盘读取的元数据。
有时我必须从ObservableList 中添加或删除大量数据。某些列表修改可能需要 5 秒或更长时间(例如,通过从 50000 个列表中删除 5000 个特定曲目)。
JavaFX 规定对支持TableView 的ObservableList 的任何更改只能在JavaFX 线程上完成。如果我在 JavaFX 线程上执行 5 秒事务,程序 UI 将冻结 5 秒,这是不可接受的行为。
我目前的解决方案是将我对主列表的更改分解为除了修改列表之外什么都不做的小事务。我将这些更改放入一个队列中,然后在 JavaFX 线程的每个循环中仅在几百毫秒内处理来自该队列的任务,以避免导致 UI 卡顿。
这很好用,但会产生其他问题,我无法管理或封装,这让我怀疑这不是一个很好的解决方案。
例如,检查 Track 是否在 ObservableList 中现在是一个复杂的过程,我必须检查 ObservableList、待处理的操作队列,然后找出列表的最终状态是什么将在处理所有操作时,并基于此返回。这既麻烦又容易出错。此模型还会在迭代由多个线程共享的列表时产生问题。
我正在寻找更好的解决方案来解决这个问题,因为列表 + 挂起的更改队列方法笨重且容易出错。
问题归结为:管理必须在 JavaFX TableView 上显示的大量对象的更改的最佳结构是什么?
【问题讨论】:
-
如果这是 Java Swing,我会说使用 SwingWorker. 它为您管理后台任务。我不知道如何将其翻译成 JFX(假设需要任何翻译)。
-
您只是在更改列表中的哪些元素?或者你可能会修改元素本身?
-
JavaFX 的
Task/Service(如@VGR 所述)和RxJavaFX 都可以帮助将列表管理工作移出JavaFX GUI 主线程。 -
确实可以在另一个线程中准备一个新列表,然后在事件线程中更新当前列表。
标签: java multithreading javafx