Как сразу запустить Workmanager

В моем приложении для Android у меня есть функция, с помощью которой пользователь может синхронизировать данные (сохраненные в sqlite), нажав кнопку «Синхронизировать» где-то в меню «Ящик». При нажатии кнопки синхронизации я запускаю службу, и данные синхронизируются с сервером.

Но теперь я использую диспетчер работы для синхронизации данных. У меня вопрос, как мы можем запустить менеджер работы сразу после нажатия кнопки.

Я создаю одноразовый запрос. иногда он срабатывает, но не в другой раз.

Вы можете использовать фоновую службу вместо Workmanager

Harish Jose 14.11.2018 11:30

@HarishJose, я не могу пользоваться сервисом. Потому что я также хочу запускать процесс синхронизации каждые 20 минут (даже если приложение находится в фоновом режиме). Если я использую службу, мне придется сделать ее службой переднего плана для обновленной версии Android (api 26 или выше).

sanjay 14.11.2018 11:34

Да, ты прав. Так почему бы вам не попробовать Workmanager с очень меньшим временем (скажем, через несколько секунд)?

Harish Jose 14.11.2018 11:38

@HarishJose мы не можем настроить Workmanager на работу менее 15 минут

sanjay 14.11.2018 11:42
9
4
5 058
4

Ответы 4

Upd: Правильный способ - отделить логику от worker и вызывать ее из worker или UI по мере необходимости. Как отметила Нурсеит, WM не предназначена для решения насущных задач. Также есть RxWorker от android.arch.work:work-runtime-ktxсм. документы, который может легко обернуть сетевой запрос или фасад Rx.

Это можно использовать в качестве быстрого исправления или эксперимента с кодированием: Вы можете отменить поставленную в очередь работу кнопкой и снова поставить ее в очередь на следующей строке. Менеджер работ попытается запустить этого нового воркера как можно скорее. Пока кнопка нажата, приложение находится на переднем плане, поэтому велика вероятность того, что работа будет запущена немедленно. Этот способ также не будет загромождать Worker путем извлечения логики задачи в отдельный класс, проверки того, что экземпляр задачи in-Worker не запущен, отмены, ожидания немедленной задачи и т. д.

в документации сказано, что workManager предназначен только для отложенных задач. Так что ждать от него немедленного исполнения не приходится. Может быть, в некоторых случаях он запустится немедленно, но нет гарантии, что он будет работать всегда. Вам следует использовать сопрограммы или исполнители.

вот ответы:

могу ли я всегда использовать WorkManager вместо сопрограмм?

https://thewikihow.com/video_pe_yqM16hPQ

если вам нужно обрабатывать каждые 20 минут или в фиксированный момент времени, попробуйте использовать диспетчер тревог

Nurseyit Tursunkulov 08.03.2019 20:03

Здесь и здесь - это "продвинутый" справочник / средний пост по WorkManager, в котором говорится об этом.

В июле 2020 года Бен Вайс (отдел по связям с разработчиками Android в Google) сказал

We recommend you use WorkManager to execute long running immediate tasks. / Just make sure to make it a foreground service by using setForeground/ setForegroundAsync.

This specifies that the WorkRequest is long-running or otherwise important. In this case, WorkManager provides a signal to the OS that the process should be kept alive if possible while this work is executing.

документы

Calls to setForegroundAsync must complete before a ListenableWorker signals completion by returning a ListenableWorker.Result.

Under the hood, WorkManager manages and runs a foreground service on your behalf to execute this WorkRequest, showing the notification provided in ForegroundInfo.

WorkManager 2.7.0 представляет концепцию ускоренной работы. Ускоренная работа начинается немедленно и завершается в течение нескольких минут. здесь док

OneTimeWorkRequestBuilder<T>().apply {
    setInputData(inputData) 
 setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
}.build()

Другие вопросы по теме