이미 큐에 추가된 작업을 업데이트합니다.

WorkManager를 사용하면 이미 작업을 완료한 후에도 WorkRequest를 업데이트할 수 있습니다. 큐에 추가했습니다. 이는 대체로 자주 변경되는 대용량 앱에서 필요합니다. 즉석에서 작업자를 업데이트해야 할 수 있습니다. WorkManager 기준 버전 2.8.0에서는 updateWork() API를 사용하면 됩니다.

updateWork() 메서드를 사용하면 수동으로 WorkRequest 작업을 하지 않아도 됩니다. 새로운 것을 대기열에 추가하는 것입니다. 따라서 개발 과정도 프로세스입니다

작업 취소 방지하기

일반적으로 기존 WorkRequest를 취소하고 새 있습니다 실행하면 앱에서 특정 작업을 반복해야 할 수 있으며 상당한 양의 추가 코드를 작성할 수 있습니다

WorkRequest 취소로 인해 다음과 같은 상황이 발생할 수 있는 경우를 살펴보겠습니다. 어려움:

  • 백엔드 요청: 컴퓨팅 중에 Worker를 취소하는 경우 새 Worker가 다시 시작되어야 하고 다시 계산할 수도 있습니다
  • 예약: PeriodicWorkRequest를 취소하고 같은 일정으로 실행할 새 PeriodicWorkRequest처럼 시간 오프셋을 계산하여 새 실행 시간이 이전 작업 요청으로 대체될 수 있습니다

updateWork() API를 사용하면 작업 요청의 제약 조건을 업데이트하고 다른 매개변수를 추가할 수 있습니다.

작업을 취소해야 하는 경우

WorkRequest를 직접 취소해야 하는 경우가 있습니다. updateWork()를 호출합니다. 이 작업은 기본적인 특성에 따라 다릅니다

직장을 업데이트해야 하는 경우

사용자 사진을 매일 백업하는 사진 앱이 있다고 가정해 보겠습니다. 여기에는 다음이 있습니다. 이를 위해 PeriodicWorkRequest를 큐에 추가했습니다. WorkRequest에 제약 조건이 있음 기기가 충전되고 Wi-Fi에 연결되어 있어야 합니다.

하지만 사용자는 고속 인터넷 연결을 사용하여 기기를 하루에 20분만 충전합니다. 충전기에 연결합니다. 이 경우 앱은 WorkRequest를 업데이트하여 충전 제약조건에 따라, 기기가 충전 중인 경우에도 사진을 완전히 충전되지 않았습니다.

이 상황에서는 updateWork() 메서드를 사용하여 작업을 업데이트할 수 있습니다. 만들 수 있습니다.

직장 주소 업데이트 방법

updateWork() 메서드는 기존 WorkRequest: 취소하고 새 목록을 큐에 추가할 필요가 없습니다.

큐에 추가된 작업을 업데이트하려면 다음 단계를 따르세요.

  1. 대기열에 추가된 작업의 기존 ID 가져오기: 요청한 WorkRequest의 ID를 가져옵니다. 님이 업데이트하려고 합니다. 이 ID는 getWorkInfo API를 사용하거나, 초기 UI의 ID를 수동으로 유지하여 나중에 공개 속성을 사용하여 검색하기 위한 WorkRequest WorkRequest.id를 대기열에 추가하기 전에 미리 준비할 수 있습니다.
  2. Create new WorkRequest(새 WorkRequest 만들기): 새 WorkRequest를 만들고 WorkRequest.Builder.setID(): 기존 ID와 일치하도록 ID 설정 WorkRequest입니다.
  3. 제약 조건 설정: WorkRequest.Builder.setConstraints()를 사용하여 WorkManager 새로운 제약 조건
  4. updateWork 호출: 새 WorkRequest를 updateWork()에 전달합니다.

직장 예시 업데이트

다음은 사용된 WorkRequest의 배터리 제약 조건을 변경하는 updateWork() 메서드 사진 업로드:

suspend fun updatePhotoUploadWork() {
    // Get instance of WorkManager.
    val workManager = WorkManager.getInstance(context)

    // Retrieve the work request ID. In this example, the work being updated is unique
    // work so we can retrieve the ID using the unique work name.
    val photoUploadWorkInfoList = workManager.getWorkInfosForUniqueWork(
        PHOTO_UPLOAD_WORK_NAME
    ).await()

    val existingWorkRequestId = photoUploadWorkInfoList.firstOrNull()?.id ?: return

    // Update the constraints of the WorkRequest to not require a charging device.
    val newConstraints = Constraints.Builder()
        // Add other constraints as required here.
        .setRequiresCharging(false)
        .build()

    // Create new WorkRequest from existing Worker, new constraints, and the id of the old WorkRequest.
    val updatedWorkRequest: WorkRequest =
        OneTimeWorkRequestBuilder<MyWorker>()
            .setConstraints(newConstraints)
            .setId(existingWorkRequestId)
            .build()

    // Pass the new WorkRequest to updateWork().
    workManager.updateWork(updatedWorkRequest)
}

결과 처리

updateWork()ListenableFuture<UpdateResult>을 반환합니다. 주어진 UpdateResult에는 표시 여부를 나타내는 여러 값 중 하나가 있을 수 있습니다. WorkManager에서 변경사항을 적용할 수 있었습니다. 또한 변경사항을 적용합니다.

자세한 내용은 updateWork() UpdateResult을 참고하세요. 참조

세대로 작업 추적

WorkRequest를 업데이트할 때마다 generation은 1씩 증가합니다. 이 현재 큐에 추가된 WorkRequest를 정확하게 추적할 수 있습니다. 세대를 통해 작업을 관찰, 추적, 테스트할 때 더 효과적으로 제어 가능 요청을 처리합니다

WorkRequest의 생성을 가져오려면 다음 단계를 따르세요.

  1. WorkInfo: WorkManager.getWorkInfoById()를 호출하여 인스턴스를 검색합니다. (WorkRequest에 해당하는 WorkInfo)
    • WorkInfo를 반환하는 여러 메서드 중 하나를 호출할 수 있습니다. 자세한 내용은 자세한 내용은 WorkManager 참조를 참고하세요.
  2. getGeneration: 호출 인스턴스에서 getGeneration()를 호출합니다. WorkInfo 반환된 IntWorkRequest입니다.
    • 생성 필드나 속성은 없으며 WorkInfo.getGeneration() 메서드를 사용하여 지도 가장자리에 패딩을 추가할 수 있습니다.

트랙 생성 예

다음은 위에서 설명한 워크플로의 구현 예입니다. WorkRequest 생성을 가져옵니다.

// Get instance of WorkManager.
val workManager = WorkManager.getInstance(context)

// Retrieve WorkInfo instance.
val workInfo = workManager.getWorkInfoById(oldWorkRequestId)

// Call getGeneration to retrieve the generation.
val generation = workInfo.getGeneration()

작업 업데이트를 위한 정책

이전에는 주기적 작업을 업데이트할 때 권장되는 해결책으로 PeriodicWorkRequestExistingPeriodicWorkPolicy.REPLACE 정책으로 바꿉니다. 동일한 고유 id를 가진 대기 중인 PeriodicWorkRequest가 있으면 새 작업 요청이 취소되고 삭제됩니다. 이 정책은 현재 다음에서 지원 중단됩니다. ExistingPeriodicWorkPolicy.UPDATE를 사용하여 워크플로를 선호합니다.

예를 들어 enqueueUniquePeriodicWorkPeriodicWorkRequest를 사용하는 경우 다음을 사용하여 새 PeriodicWorkRequest를 초기화할 수 있습니다. ExistingPeriodicWorkPolicy.UPDATE 정책 만약 대기 중인 PeriodicWorkRequest가 동일한 경우 WorkManager는 이를 사용할 수 있습니다 이 워크플로에서는 updateWork()