Запуск фоновых задач в Android с помощью WorkManager: часть 2

Запуск фоновых задач в Android с помощью WorkManager: часть 2

21 апреля 2023 г.

Предыдущая статья из этой серии: Выполнение фоновых задач в Android с WorkManager: часть 1

Ограничение запуска задачи

WorkManager позволяет нам установить ограничение для запуска задачи. Например, рассматриваемой задачей может быть проверка наличия на устройстве интернет-сервиса. Когда вы передаете такую ​​задачу WorkManager.enqueue, она проверяет наличие подключения к Интернету. Если соединение есть, то задание запустится. А если его нет, то задача будет висеть в статусе ЗАЧИСЛЕНА до появления интернета.

Если задача запущена и по какой-то причине пропал Интернет, задача будет остановлена ​​и запланирована заново (В ОЧЕРЕДИ).

Давайте посмотрим, какое ограничение мы можем установить.

Например, мы будем использовать такую ​​задачу.

class WorkManager (context: Context, parameters: WorkerParameters) : Worker(context, parameters) {  

    private val TAG = this.javaClass.simpleName  

    override fun doWork(): Result {  

        Log.d(TAG, "doWork: start")  

        try {  

            (0 .. 10).forEach {  

                TimeUnit.SECONDS.sleep(10)  

                Log.d(TAG, "${it}, isStopped: $isStopped")  

                if (isStopped)  

                    return Result.failure()  

            }  

        } catch (e: InterruptedException) {  

            e.printStackTrace()  

        }  

        Log.d(TAG, "doWork: end")  

        return Result.success()  

    }  

    override fun onStopped() {  

        super.onStopped()  

        Log.d(TAG, "onStopped: ")  

    }  

}

Цикл 10 приостанавливается и регистрируется статус isStopped. Если задача была остановлена, то выйти со статусом FAILURE.

Мы также регистрируем метод onStopped.

В действии приведенный ниже код используется для отслеживания статуса задачи:

WorkManager.getInstance(this)  

    .getWorkInfoByIdLiveData(workRequest.id)  

    .observe(this) { workInfo ->  

        Log.d(TAG, "onChanged: " + workInfo.state)  

    }

setRequiresCharging (логическое значение requireCharging)

Ограничение: зарядное устройство должно быть подключено.

Код для добавления ограничения выглядит следующим образом:

val constraints = Constraints.Builder()  

    .setRequiresCharging(true)  

    .build()  

val workRequest: WorkRequest = OneTimeWorkRequestBuilder<MyWorker>()  

    .setConstraints(constraints)  

    .build()

В Constraints.Builder мы включаем критерий setRequiresCharging, создаем объект Constraints и передаем его в OneTimeWorkRequest.Builder в методе setConstraints. р>

setRequiresBatteryNotLow (логическое значение requiredBatteryNotLow)

Ограничение: уровень заряда батареи не ниже критического.

setRequiredNetworkType(NetworkType networkType)

Ограничение: наличие Интернета.

Мы можем указать, какой тип интернет-сети (NetworkType) следует использовать при запуске задачи:

ПОДКЛЮЧЕНО – Wi-Fi или мобильные данные БЕЗ ИЗМЕРЕНИЯ – только Wi-Fi METERED – только мобильные данные NOT_ROAMING - Интернет не должен быть в роуминге NOT_REQUIRED - Интернет не требуется

setRequiresDeviceIdle (логическое значение requireDeviceIdle)

Ограничение: устройство некоторое время не использовалось и перешло в спящий режим. Работает с API 23 и выше.

setRequiresStorageNotLow (логическое значение требуетStorageNotLow)

Ограничение: на устройстве должно быть свободное место, не меньше критического порога.

addContentUriTrigger(Uri uri, логический триггерForDescendants)

Ограничение: задача будет выполняться при обновлении содержимого указанного Uri. Работает с API 24 и выше.

Для одной задачи можно установить сразу несколько ограничений.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE