← Назад к вопросам

Как отменить Job в WorkManager

1.8 Middle🔥 61 комментариев
#Android компоненты#Многопоточность и асинхронность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как отменить 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 секунд

Лучшие практики

  1. Используй теги для группировки связанных работ
  2. Проверяй isStopped в Worker для корректной обработки отмены
  3. Слушай статус через LiveData или Flow
  4. Не блокируй главный поток при отмене работ

Заключение

WorkManager предоставляет несколько способов отмены работ: по ID, тегу, названию или отмену всех сразу. Правильная обработка отмены в Worker'е гарантирует чистое завершение фоновых задач.