Начало работы с WorkManager

Чтобы начать использовать WorkManager, сначала импортируйте библиотеку в свой проект Android.

Добавьте следующие зависимости в файл build.gradle вашего приложения:

классный

dependencies {
    def work_version = "2.9.1"

    // (Java only)
    implementation "androidx.work:work-runtime:$work_version"

    // Kotlin + coroutines
    implementation "androidx.work:work-runtime-ktx:$work_version"

    // optional - RxJava2 support
    implementation "androidx.work:work-rxjava2:$work_version"

    // optional - GCMNetworkManager support
    implementation "androidx.work:work-gcm:$work_version"

    // optional - Test helpers
    androidTestImplementation "androidx.work:work-testing:$work_version"

    // optional - Multiprocess support
    implementation "androidx.work:work-multiprocess:$work_version"
}

Котлин

dependencies {
    val work_version = "2.9.1"

    // (Java only)
    implementation("androidx.work:work-runtime:$work_version")

    // Kotlin + coroutines
    implementation("androidx.work:work-runtime-ktx:$work_version")

    // optional - RxJava2 support
    implementation("androidx.work:work-rxjava2:$work_version")

    // optional - GCMNetworkManager support
    implementation("androidx.work:work-gcm:$work_version")

    // optional - Test helpers
    androidTestImplementation("androidx.work:work-testing:$work_version")

    // optional - Multiprocess support
    implementation("androidx.work:work-multiprocess:$work_version")
}

После того, как вы добавили зависимости и синхронизировали проект Gradle, следующим шагом будет определение некоторой работы для выполнения.

Определите работу

Работа определяется с помощью класса Worker . Метод doWork() выполняется асинхронно в фоновом потоке, предоставленном WorkManager.

Чтобы создать некоторую работу для выполнения WorkManager, расширьте класс Worker и переопределите метод doWork() . Например, чтобы создать Worker , который загружает изображения, вы можете сделать следующее:

Котлин

class UploadWorker(appContext: Context, workerParams: WorkerParameters):
       Worker(appContext, workerParams) {
   override fun doWork(): Result {

       // Do the work here--in this case, upload the images.
       uploadImages()

       // Indicate whether the work finished successfully with the Result
       return Result.success()
   }
}

Ява

public class UploadWorker extends Worker {
   public UploadWorker(
       @NonNull Context context,
       @NonNull WorkerParameters params) {
       super(context, params);
   }

   @Override
   public Result doWork() {

     // Do the work here--in this case, upload the images.
     uploadImages();

     // Indicate whether the work finished successfully with the Result
     return Result.success();
   }
}

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

  • Result.success() : работа успешно завершена.
  • Result.failure() : Работа не удалась.
  • Result.retry() : Работа не удалась, и ее следует повторить в другое время в соответствии с политикой повторных попыток .

Создать рабочий запрос

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

Как бы вы ни решили запланировать работу, вы всегда будете использовать WorkRequest . В то время как Worker определяет единицу работы, WorkRequest (и его подклассы) определяют, как и когда его следует запускать. В простейшем случае вы можете использовать OneTimeWorkRequest , как показано в следующем примере.

Котлин

val uploadWorkRequest: WorkRequest =
   OneTimeWorkRequestBuilder<UploadWorker>()
       .build()

Ява

WorkRequest uploadWorkRequest =
   new OneTimeWorkRequest.Builder(UploadWorker.class)
       .build();

Отправьте WorkRequest в систему

Наконец, вам нужно отправить WorkRequest в WorkManager используя метод enqueue() .

Котлин

WorkManager
    .getInstance(myContext)
    .enqueue(uploadWorkRequest)

Ява

WorkManager
    .getInstance(myContext)
    .enqueue(uploadWorkRequest);

Точное время выполнения работника зависит от ограничений, используемых в вашем WorkRequest и от оптимизации системы. WorkManager спроектирован так, чтобы обеспечить наилучшее поведение при этих ограничениях.

Следующие шаги

Это руководство по началу работы лишь поверхностно. WorkRequest также может включать дополнительную информацию, такую ​​как ограничения, при которых должна выполняться работа, входные данные для работы, задержка и политика отсрочки для повторной попытки работы. В следующем разделе «Определение рабочих запросов» вы узнаете об этих параметрах более подробно, а также поймете, как планировать уникальные и повторяющиеся работы.

Дополнительные ресурсы

Помимо справочной документации, существует несколько блогов, лабораторий кода и примеров кода, которые помогут вам начать работу.

Образцы

  • WorkManagerSample — простое приложение для обработки изображений.
  • Sunflower — демонстрационное приложение, демонстрирующее лучшие практики работы с различными компонентами архитектуры, включая WorkManager.

Кодлабы

Блоги