Асинхронная (отвязанная от логина) загрузка дашборда

Доброго дня.

Размещаю несколько чартов в mainWindow. Хотелось бы отвязать загрузку чартов от процесса входа в систему. Было бы неплохо, если бы они загружались асинхронно.
Подскажите, возможно ли?

Посмотри в сторону фоновых задач.
Если чарты строятся с помощью декларативно заданных запросов, то сделай программную загрузку вручную через фоновую задачу

2 симпатии

Алексей, спасибо.
Как-нибудь попробую поковырять, но пока это несколько не очевидно.

Чарты строятся следующим образом: в методе 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 КБ).

1 симпатия

Глеб, спасибо за семпл.
Я уже реализовал загрузку с помощью 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! Не сталкивались с такой ошибкой?30

Если обновить страницу (F5), то все будет ок и последующие рендеринги срабатывают без ошибок.

Добрый день.

Не могли бы Вы создать отдельный топик для Вашей проблемы и приложить демо проект или, как минимум, код экрана (дескриптор и контроллер)?

Вот ссылка на тикет:
https://www.cuba-platform.ru/discuss/t/otlozhennaya-zagruzka-chartov/1588?u=shut.desert