WorkManager 시작하기

WorkManager를 사용하기 위해 먼저 라이브러리를 Android 프로젝트로 가져옵니다.

앱의 build.gradle 파일에 다음 종속 항목을 추가합니다.

Groovy

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"
}

Kotlin

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를 만들려면 다음과 같이 할 수 있습니다.

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

자바

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

doWork()에서 반환된 Result는 작업의 성공 여부를 알려주며 실패한 경우 WorkManager 서비스에 작업을 재시도해야 하는지 알려줍니다.

  • Result.success(): 작업이 성공적으로 완료되었습니다.
  • Result.failure(): 작업에 실패했습니다.
  • Result.retry(): 작업에 실패했으며 재시도 정책에 따라 다른 시점에 시도되어야 합니다.

WorkRequest 만들기

작업을 정의하고 나면 실행을 위해 WorkManager 서비스로 예약해야 합니다. WorkManager에서는 작업을 예약하는 다양한 방법을 제공합니다. 일정한 간격으로 주기적으로 실행되도록 예약하거나 한 번만 실행되도록 예약할 수 있습니다.

어떤 작업 예약 방식을 선택하든 항상 WorkRequest를 사용합니다. Worker는 작업 단위를 정의하는 반면 WorkRequest(및 서브클래스)는 언제, 어떻게 작업이 실행되어야 하는지 정의합니다. 가장 간단한 경우 다음 예와 같이 OneTimeWorkRequest를 사용하면 됩니다.

Kotlin

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

자바

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

시스템에 WorkRequest 제출

마지막으로 enqueue() 메서드를 사용하여 WorkRequestWorkManager에 제출해야 합니다.

Kotlin

WorkManager
    .getInstance(myContext)
    .enqueue(uploadWorkRequest)

자바

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

작업자가 실행되는 정확한 시간은 WorkRequest에 사용된 제약조건과 시스템 최적화에 따라 달라집니다. WorkManager는 이러한 제한사항에 따라 최상의 상태로 작동하도록 설계되었습니다.

다음 단계

이 시작 가이드에서는 기본사항만 간략하게 살펴봅니다. WorkRequest에는 추가 정보도 포함될 수 있습니다(예: 작업 실행의 제약조건, 작업 입력, 지연, 작업 재시도를 위한 백오프 정책). 다음 섹션 작업 요청 정의에서는 이러한 옵션을 자세히 알아보고 고유 작업 및 반복 작업을 예약하는 방법을 알아봅니다.

추가 리소스

가이드 문서 외에도 시작하는 데 도움이 되는 여러 블로그, Codelab, 코드 샘플이 있습니다.

샘플

  • Sunflower: WorkManager를 비롯한 다양한 아키텍처 구성요소의 권장사항을 보여주는 데모 앱

Codelab

블로그