All
У нас проблемы с загрузкой данных в нашем приложении. Целью текущей реализации было создание асинхронного механизма загрузки данных.
Я в основном хочу знать, есть ли какие-либо хорошие модели или практики для этого.
Приложение имеет множество различных компонентов пользовательского интерфейса, которые не кодируются стандартным способом. Все это генерируется из конфигурации (то есть xml). Загрузка данных запускается нажатием на календарь, который отправляет асинхронное сообщение загрузчикам данных, из которых существует около 6 экземпляров (того же класса), которые загружают данные из базы данных. После того как данные загружены и обработаны, класс загрузчика данных затем асинхронно отправит данные таблицы в таблицу JTable, в которой они будут отображаться.
Поскольку загрузка данных может занять от секунды или около того до 1 или 2 минут, требовался диалог прогресса. Был написан дополнительный класс для прослушивания событий от загрузчиков данных при запуске / завершении загрузки данных. Когда любой загрузчик данных начинает загрузку, отображается диалоговое окно, указывающее, что данные загружались. Когда последний загрузчик данных завершил, диалог должен быть скрыт.
Текущие проблемы / проблемы
Возникают 2 проблемы:
- Иногда диалоговое окно остается видимым, даже если все загрузчики данных завершили.
- В других случаях данные могут не отображаться в таблице.
Мы тщетно пытались добавить синхронизируемое ключевое слово вокруг методов отображения и скрытия прогресса, но все равно получаем аналогичные. Я думаю, что какое-то переписывание может быть в порядке, но я хочу понять немного больше об асинхронных шаблонах Java. Механизм должен быть более надежным и надежным.
Текущий процесс
Если вы заинтересованы в нашем текущем процессе, я попытался обобщить события ниже. Это может пролить свет на проблемы в разработке / реализации.
Пользователь нажимает на день в календаре.
Компонент календаря отправляет сообщение каждому экземпляру загрузчика данных с указанием начать загрузку. Это сообщение отправляется из календаря асинхронно в отдельном потоке (2).
Загрузчик данных получает сообщение о загрузке
Каждый DataLoader отвечает за загрузку соответствующих данных и передачу их в таблицу для отображения.
Каждый загрузчик данных имеет отдельный экземпляр потока, в который загружаются данные. Если текущий экземпляр загрузки потока установлен и загружает данные, тогда загрузка прерывается - что может произойти из-за быстрого щелчка по дням в календаре. Новый экземпляр потока создается и запускается, когда поток загрузки данных простаивает или обнуляется.
Поток загрузки данных затем выполняет доступ к данным и их обработку. При запуске класс DataLoadDialog получает уведомление (3). Этот DataLoadDialog в основном добавляет прослушиватель (DataLoaderListener расширяет EventListener) к EventListenerList. Когда поток данных загружается, вызывается DataLoaderListener.loadStart, который захватывается DataLoadDialog. Когда поток загружает и обрабатывает данные, вызывается DataLoaderListener.loadComplete. Это снова фиксируется в DataLoadDialog.
Теперь, когда данные загружены, DataLoader отправляет данные в таблицу для отображения.
Inform DataLoadDialog статуса загрузки
DataLoadDialog имеет ссылку на каждый загрузчик данных. Каждый загрузчик данных имеет статус, доступ к которому осуществляется через геттер, который возвращает перечисление Idle или Loading. Всякий раз, когда DataLoadDialog получает вызов loadStart или loadComplete, он определяет, показывать или не показывать диалоговое окно хода выполнения, в зависимости от состояния потоков загрузки данных.
Диалог процесса - это одноэлементный статический экземпляр, который создается при создании класса (из xml конфигурации).
Любая помощь приветствуется.Если я что-то пропустил, тогда, пожалуйста, добавьте комментарий, и я обновлю вопрос.
Спасибо,
Andez