Доброго дня.
Размещаю несколько чартов в mainWindow. Хотелось бы отвязать загрузку чартов от процесса входа в систему. Было бы неплохо, если бы они загружались асинхронно.
Подскажите, возможно ли?
Доброго дня.
Размещаю несколько чартов в mainWindow. Хотелось бы отвязать загрузку чартов от процесса входа в систему. Было бы неплохо, если бы они загружались асинхронно.
Подскажите, возможно ли?
Посмотри в сторону фоновых задач.
Если чарты строятся с помощью декларативно заданных запросов, то сделай программную загрузку вручную через фоновую задачу
Алексей, спасибо.
Как-нибудь попробую поковырять, но пока это несколько не очевидно.
Чарты строятся следующим образом: в методе init()
главного экрана, вызывается сервис, который в свою очередь выполняет запрос во представление (view) БД, далее этих данных формируем List<DataItem>
и устанавливаем их для диаграммы с помощью setDataProvider
.
При этом, если “что-то пошло не так” в систему нельзя войти. Плюс, если данных будет больше, есть опасения, что вход в систему будет продолжительным.
Если уже вызывается сервис, то просто его вызов запусти в отдельном потоке
Добрый день, @sergeevms!
Как советовали выше, Вы можете использовать фоновые задачи для наполнения графика данными. Ниже пример:
private BackgroundTask<Void, List<Product>> createBackgroundTask(SerialChart productPriceChart) {
return new BackgroundTask<Void, List<Product>>(10, ExtAppMainWindow.this) {
@Override
public List<Product> run(TaskLifeCycle<Void> taskLifeCycle) {
// Код, который выполняется в отдельном потоке и долго загружает данные
return salesService.getProducts();
}
@Override
public void done(List<Product> result) {
// Заполняем dataProvider полученными данными (т.е. сущностями) в основном потоке
DataProvider dataProvider = new ListDataProvider();
for (Product entity : result) {
dataProvider.addItem(new EntityDataItem(entity));
}
productPriceChart.setDataProvider(dataProvider);
}
};
}
Прикладываю демо проект sample-sales.zip (111,0 КБ).
Глеб, спасибо за семпл.
Я уже реализовал загрузку с помощью BackgroundTask.
Правда не использовал метод done(List<Product> result)
. Заполнял dataProvider
там же. Попробую ваш вариант.
Но я не смог получить понимания о тайм-ауте, поскольку даже при вызовы таска наносекундным таймаутом получал заполненный чарт.
BackgroundTask<Integer, Void> setUpRunlifeChartTask = new BackgroundTask<Integer, Void>(1, TimeUnit.NANOSECONDS, this)
Ну и уже чисто в исследовательских целях. Как можно реализовать какой-нибудь круговой прогресс бар вместо чарта до его загрузки?
Воспользуйтесь компонентом ProgressBar и установите для него стиль indeterminate-circle
.
Пример в Sampler: https://demo.cuba-platform.com/sampler/open?screen=indeterminate-progressbar
Возникла ошибка, при рендеринге чарта в backgroundTask! Не сталкивались с такой ошибкой?
Если обновить страницу (F5), то все будет ок и последующие рендеринги срабатывают без ошибок.
Добрый день.
Не могли бы Вы создать отдельный топик для Вашей проблемы и приложить демо проект или, как минимум, код экрана (дескриптор и контроллер)?