Как отменить Job в WorkManager
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как отменить Job в WorkManager
WorkManager — это библиотека для планирования фоновых задач в Android. WorkManager предоставляет встроенные механизмы для отмены запланированных работ.
Отмена по ID работы
Самый простой способ отменить задачу — использовать её уникальный ID:
val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
.build()
val workId = workRequest.id
WorkManager.getInstance(context).cancelWorkById(workId)
Это немедленно отменит работу, если она ещё не выполняется, или остановит её выполнение.
Отмена по тегу
Можно отменить все работы с определённым тегом:
val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
.addTag("sync_data")
.build()
WorkManager.getInstance(context).cancelAllWorkByTag("sync_data")
Это полезно, когда нужно отменить группу связанных работ одновременно.
Отмена уникальной работы
Для именованных работ используй метод отмены по имени:
val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
.build()
WorkManager.getInstance(context).enqueueUniqueWork(
"fetch_data",
ExistingWorkPolicy.KEEP,
workRequest
)
// Отмена
WorkManager.getInstance(context).cancelUniqueWork("fetch_data")
Наблюдение за статусом работы
val workId = workRequest.id
WorkManager.getInstance(context)
.getWorkInfoByIdLiveData(workId)
.observe(lifecycleOwner) { info ->
when (info?.state) {
WorkInfo.State.SUCCEEDED -> println("Успешно")
WorkInfo.State.FAILED -> println("Ошибка")
WorkInfo.State.CANCELLED -> println("Отменена")
WorkInfo.State.RUNNING -> println("Выполняется")
else -> {}
}
}
Обработка отмены в Worker
class MyWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
try {
while (!isStopped) { // Проверяем флаг отмены
// Выполняем работу
Thread.sleep(1000)
}
return Result.success()
} catch (e: Exception) {
return Result.retry()
}
}
}
Отмена всех работ
WorkManager.getInstance(context).cancelAllWork()
Это отменит все запланированные и выполняемые работы.
Отмена с задержкой
val workId = workRequest.id
// Отмена после определённой задержки
Handler(Looper.getMainLooper()).postDelayed({
WorkManager.getInstance(context).cancelWorkById(workId)
}, 5000) // 5 секунд
Лучшие практики
- Используй теги для группировки связанных работ
- Проверяй isStopped в Worker для корректной обработки отмены
- Слушай статус через LiveData или Flow
- Не блокируй главный поток при отмене работ
Заключение
WorkManager предоставляет несколько способов отмены работ: по ID, тегу, названию или отмену всех сразу. Правильная обработка отмены в Worker'е гарантирует чистое завершение фоновых задач.