У меня есть ObservableList
«Треков», отображаемых на TableView
. Содержимое ObservableList
основано на метаданных, считанных с диска.
Иногда мне приходится добавлять или удалять большие порции данных из ObservableList
. Некоторые изменения списка могут занять пять секунд или дольше (например, путем удаления 5000 определенных дорожек из списка 50000).
JavaFX требует, чтобы любые изменения в ObservableList
, поддерживающие TableView
, выполнялись только в потоке JavaFX. Если я выполняю 5-секундную транзакцию в потоке JavaFX, пользовательский интерфейс программы зависнет на 5 секунд, что является недопустимым поведением.
Мое текущее решение состоит в том, чтобы разбить мои изменения в первичном списке на небольшие транзакции, которые не делают ничего, кроме изменения списка. Я помещаю эти изменения в очередь, а затем обрабатываю задачи из этой очереди в каждом цикле потока JavaFX всего за несколько сотен миллисекунд, чтобы избежать возникновения зависаний пользовательского интерфейса.
Это работает достаточно хорошо, но создает другие проблемы, с которыми у меня возникают проблемы при управлении или инкапсуляции, и это заставляет меня подозревать, что это не очень хорошее решение.
Например, проверка того, находится ли дорожка в ObservableList
, теперь является сложным процессом, в котором мне нужно проверить ObservableList
, очередь ожидающих действий, а затем выяснить, какое конечное состояние списка будет, когда все действия будут обработаны, и возврат на основе этого. Это громоздко и подвержено ошибкам. Эта модель также создает проблемы с итерацией по списку, совместно используемому несколькими потоками.
Я ищу лучшее решение этой проблемы, потому что метод списка + ожидающих изменений является неуклюжим и подвержен ошибкам.
Вопрос сводится к следующему: Какая структура лучше всего подходит для управления изменениями в большом списке объектов, которые должны отображаться в JavaFX TableView
?