0Pricing
Android Academy · Урок

Создание Worker

Определяйте фоновую работу в Worker

«Создание Worker» — бесплатный урок Android Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.

Создание рабочего компонента

Единицей фоновой работы в WorkManager является рабочий компонент. Задачу определяют, создавая подкласс базового класса рабочего компонента и переопределяя его метод работы.

CoroutineWorker

В Kotlin расширьте CoroutineWorker. Его doWork() — это функция suspend, поэтому Вы можете вызывать другие приостанавливаемые функции и естественным образом выполнять работу в фоновом диспетчере.

class UploadWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {
    override suspend fun doWork(): Result {
        // background work here
        return Result.success()
    }
}

Конструктор

Каждый рабочий компонент принимает в конструкторе Context и WorkerParameters и передаёт их суперклассу. WorkManager создаёт экземпляр рабочего компонента за Вас; напрямую вызывать конструктор не нужно.

doWork возвращает результат

doWork() должен возвращать Result, описывающий результат выполнения. Возможны три варианта.

  • Result.success()
  • Result.retry()
  • Result.failure()

Result.success

Возвращайте Result.success(), когда работа завершена. Работа удаляется из очереди. При необходимости можно прикрепить выходные данные, чтобы передать их следующей связанной работе.

override suspend fun doWork(): Result {
    uploadLogs()
    return Result.success()
}

Result.retry

Возвращайте Result.retry() при временной ошибке, например при неполадке сети, которая скоро может исчезнуть. WorkManager повторно запустит рабочий компонент позже в соответствии с политикой задержки.

override suspend fun doWork(): Result {
    return try {
        syncData()
        Result.success()
    } catch (e: IOException) {
        Result.retry()
    }
}

Result.failure

Возвращайте Result.failure() при постоянной ошибке, которую повторный запуск не исправит, например при недопустимых входных данных. Работа прекращается, а зависящие от неё связанные задачи не запускаются.

Чтение входных данных

Небольшие входные данные передаются через Data при добавлении работы в очередь, а внутри рабочего компонента считываются с помощью inputData. Объём данных должен быть небольшим: этот механизм не предназначен для крупных наборов данных.

override suspend fun doWork(): Result {
    val userId = inputData.getString("user_id") ?: return Result.failure()
    sync(userId)
    return Result.success()
}

Возврат выходных данных

Рабочие компоненты могут возвращать Data в своём результате, и связанные с ними рабочие компоненты получают эти данные как входные. Так передаются результаты между этапами.

val output = workDataOf("count" to 42)
return Result.success(output)

Работа в подходящем диспетчере

CoroutineWorker по умолчанию выполняет doWork() в Dispatchers.Default. Для блокирующих операций ввода-вывода переключайтесь с помощью withContext(Dispatchers.IO), чтобы не перегружать стандартный пул.

override suspend fun doWork(): Result = withContext(Dispatchers.IO) {
    readAndUploadFile()
    Result.success()
}

Рабочие компоненты должны быть автономными

Рабочий компонент может запуститься спустя долгое время после планирования и в новом процессе. Не полагайтесь на состояние приложения в памяти: передавайте необходимые данные через входные данные или считывайте их из постоянного хранилища.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли создание рабочего компонента.

Итоги

Вы создали рабочий компонент:

  • расширили CoroutineWorker и переопределили приостанавливаемую функцию doWork();
  • возвращали Result.success(), Result.retry() или Result.failure();
  • считывали inputData и возвращали выходные данные Data;
  • использовали Dispatchers.IO для блокирующей работы и сделали рабочие компоненты автономными.

Далее: ограничения и планирование.

Часто задаваемые вопросы

Урок «Создание Worker» бесплатный?

Да — полный текст урока «Создание Worker» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.

Чему я научусь в уроке «Создание Worker»?

Определяйте фоновую работу в Worker Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Создание Worker»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Когда использовать WorkManager
  2. Создание Worker
  3. Ограничения и планирование
  4. Периодическая и связанная работа
← Назад к Android Academy