В моем приложении для Android у меня есть функция, с помощью которой пользователь может синхронизировать данные (сохраненные в sqlite), нажав кнопку «Синхронизировать» где-то в меню «Ящик». При нажатии кнопки синхронизации я запускаю службу, и данные синхронизируются с сервером.
Но теперь я использую диспетчер работы для синхронизации данных. У меня вопрос, как мы можем запустить менеджер работы сразу после нажатия кнопки.
Я создаю одноразовый запрос. иногда он срабатывает, но не в другой раз.
@HarishJose, я не могу пользоваться сервисом. Потому что я также хочу запускать процесс синхронизации каждые 20 минут (даже если приложение находится в фоновом режиме). Если я использую службу, мне придется сделать ее службой переднего плана для обновленной версии Android (api 26 или выше).
Да, ты прав. Так почему бы вам не попробовать Workmanager с очень меньшим временем (скажем, через несколько секунд)?
@HarishJose мы не можем настроить Workmanager на работу менее 15 минут
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 минут или в фиксированный момент времени, попробуйте использовать диспетчер тревог
Здесь и здесь - это "продвинутый" справочник / средний пост по 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()
Вы можете использовать фоновую службу вместо Workmanager