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

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

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

Классный

dependencies {
    def work_version = "2.12.0"

    // (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.12.0"

    // (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, который загружает изображения, можно сделать следующее:

Kotlin

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()
   }
}

Java

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() – задача не выполнена и должна быть запущена повторно в соответствии с правилами повторных попыток.

Создание WorkRequest

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

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

Kotlin

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

Java

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

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

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

Kotlin

WorkManager
    .getInstance(myContext)
    .enqueue(uploadWorkRequest)

Java

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

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

Дальнейшие действия

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

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

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

Образцы

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

Практические работы

Блоги