Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

작업 요청 정의

시작 가이드에서는 간단한 WorkRequest를 만들고 큐에 추가하는 방법을 살펴보았습니다.

이 가이드에서는 일반적인 사용 사례를 처리하도록 작업 요청을 맞춤설정하는 방법을 알아봅니다.

  • 네트워크 가용성과 같은 작업 제약 조건 처리
  • 작업 실행의 최소 지연 보장
  • 작업 다시 시도 및 백오프 처리
  • 작업의 입력 및 출력 처리
  • 태그하여 작업 그룹화

작업 제약 조건

작업에 Constraints를 추가하여 실행할 수 있는 시기를 나타낼 수 있습니다.

예를 들어, 기기가 유휴 상태이고 전원에 연결된 때만 작업을 실행하도록 지정할 수 있습니다.

아래의 코드는 이러한 제약 조건을 OneTimeWorkRequest에 추가하는 방법을 보여줍니다. 지원되는 제약 조건의 전체 목록은 Constraints.Builder 참조 문서을 확인하세요.

Kotlin


    // Create a Constraints object that defines when the task should run
    val constraints = Constraints.Builder()
            .setRequiresDeviceIdle(true)
            .setRequiresCharging(true)
            .build()

    // ...then create a OneTimeWorkRequest that uses those constraints
    val compressionWork = OneTimeWorkRequestBuilder<CompressWorker>()
            .setConstraints(constraints)
            .build()

    

자바

    // Create a Constraints object that defines when the task should run
    Constraints constraints = new Constraints.Builder()
        .setRequiresDeviceIdle(true)
        .setRequiresCharging(true)
         .build();

    // ...then create a OneTimeWorkRequest that uses those constraints
    OneTimeWorkRequest compressionWork =
                    new OneTimeWorkRequest.Builder(CompressWorker.class)
         .setConstraints(constraints)
         .build();
    

여러 제약 조건이 지정되면 모든 제약 조건이 충족될 때만 작업이 실행됩니다.

작업이 실행되는 동안 제약 조건이 실패하면 WorkManager에서 작업자를 중지합니다. 그런 다음 제약 조건이 충족되면 작업이 다시 시도됩니다.

초기 지연

작업이 큐에 추가될 때 작업에 제약 조건이 없거나 모든 작업 조건이 충족되는 경우 시스템은 즉시 작업을 실행하기로 선택할 수 있습니다. 작업을 즉시 실행하지 않으려면 최소 초기 지연 후 시작하도록 작업을 지정할 수 있습니다.

다음은 작업이 큐에 추가된 후 최소 10분 후에 실행되도록 작업을 설정하는 방법의 예입니다.

Kotlin


    val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setInitialDelay(10, TimeUnit.MINUTES)
            .build()

    

자바


    OneTimeWorkRequest uploadWorkRequest = new OneTimeWorkRequest.Builder(UploadWorker.class)
            .setInitialDelay(10, TimeUnit.MINUTES)
            .build();

    

다시 시도 및 백오프 정책

WorkManager에서 작업을 다시 시도해야 하는 경우 작업자 인스턴스에서 Result.retry()를 반환할 수 있습니다.

작업은 기본 백오프 지연 및 정책을 사용하여 다시 예약됩니다. 백오프 지연은 작업을 다시 시도하기 전에 기다려야 하는 최소 시간을 지정합니다. 백오프 정책은 다음 재시도의 백오프 지연이 시간 경과에 따라 증가하는 방식을 정의합니다. 기본값은 EXPONENTIAL입니다.

다음은 백오프 지연 및 정책을 맞춤설정하는 예입니다.

Kotlin


    val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setBackoffCriteria(
                    BackoffPolicy.LINEAR,
                    OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
                    TimeUnit.MILLISECONDS)
            .build()

    

자바


    OneTimeWorkRequest uploadWorkRequest =
        new OneTimeWorkRequest.Builder(UploadWorker.class)
            .setBackoffCriteria(
                    BackoffPolicy.LINEAR,
                    OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
                    TimeUnit.MILLISECONDS)
            .build();
    

작업의 입력/출력 정의

작업에서 입력 매개변수로 전달하거나 결과로 반환되어야 하는 데이터를 요구할 수도 있습니다. 예를 들어, 이미지 업로드를 처리하는 작업은 이미지의 URI를 입력으로 업로드해야 하며 업로드된 이미지의 URL을 출력으로 요구할 수 있습니다.

입력 및 출력 값은 키-값 쌍으로 Data 객체에 저장됩니다. 아래 코드는 WorkRequest에서 입력 데이터를 설정하는 방법을 보여줍니다.

Kotlin


    // workDataOf (part of KTX) converts a list of pairs to a [Data] object.
    val imageData = workDataOf(Constants.KEY_IMAGE_URI to imageUriString)

    val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setInputData(imageData)
            .build()

    

자바


    Data imageData = new Data.Builder()
                    .putString(Constants.KEY_IMAGE_URI, imageUriString)
                    .build();

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

Worker 클래스는 Worker.getInputData()를 호출하여 입력 인수에 액세스할 수 있습니다.

마찬가지로 Data 클래스를 사용하여 반환 값을 출력할 수 있습니다. 아래와 같이 Result.success() 또는 Result.failure()Result에 포함하여 Data 객체를 반환합니다.

Kotlin

    class UploadWorker(appContext: Context, workerParams: WorkerParameters)
        : Worker(appContext, workerParams) {

        override fun doWork(): Result {

                // Get the input
                val imageUriInput = getInputData().getString(Constants.KEY_IMAGE_URI)
                // TODO: validate inputs.
                // Do the work
                val response = uploadFile(imageUriInput)

                // Create the output of the work
                val outputData = workDataOf(Constants.KEY_IMAGE_URL to response.imageUrl)

                // Return the output
                return Result.success(outputData)

        }
    }

    

자바

    public class UploadWorker extends Worker {

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

        @Override
        public Result doWork() {

            // Get the input
            String imageUriInput =
                    getInputData().getString(Constants.KEY_IMAGE_URI);
            // TODO: validate inputs.
            // Do the work
            Response response = uploadFile(imageUriInput);

            // Create the output of the work
            Data outputData = new Data.Builder
                    .putString(Constants.KEY_IMAGE_URL, response.imageUrl)
                    .build();

            // Return the output
            return Result.success(outputData);
        }
    }
    

태그 작업

WorkRequest 객체에 태그 문자열을 할당하여 작업을 논리적으로 그룹화할 수 있습니다. 이렇게 하면 특정 태그를 사용하여 모든 작업을 실행할 수 있습니다.

예를 들어 WorkManager.cancelAllWorkByTag(String)는 특정 태그가 있는 모든 작업을 취소하고 WorkManager.getWorkInfosByTagLiveData(String)는 이 태그가 있는 모든 작업의 상태 목록과 함께 LiveData를 반환합니다.

다음 코드는 WorkRequest.Builder.addTag(String)를 사용하여 작업에 cleanup 태그를 추가하는 방법을 보여줍니다.

Kotlin

    val cacheCleanupTask =
            OneTimeWorkRequestBuilder<CacheCleanupWorker>()
        .setConstraints(constraints)
        .addTag("cleanup")
        .build()
    

자바

    OneTimeWorkRequest cacheCleanupTask =
            new OneTimeWorkRequest.Builder(CacheCleanupWorker.class)
        .setConstraints(constraints)
        .addTag("cleanup")
        .build();