[Android - Kotlin] Jetpack Compose - 10

민채·2024년 3월 11일
0

Android - Codelab

목록 보기
10/10

WorkManager

  • Android에서 권장되는 작업 스케줄러로, 지연 가능한 작업을 실행하도록 보장
  • 상황별 실행과 보장된 실행을 조합하여 적용해야 하는 백그라운드 작업을 위한 아키텍처 구성요소
  • WorkManager는 아래와 같은 작업에 사용하는 것이 적합
    • 주기적으로 최신 뉴스 기사 쿼리
    • 이미지에 필터를 적용한 다음 이미지 저장
    • 주기적으로 로컬 데이터를 네트워크와 동기화

장점

  • 비동기 일회성 작업과 주기적인 작업 모두 지원
  • 네트워크 상태, 저장공간, 충전 상태와 같은 제약 조건 지원
  • 동시 작업 실행과 같은 복잡한 작업 요청 체이닝
  • 한 작업 요청의 출력이 다음 작업 요청의 입력으로 사용됨
  • API 수준 14까지 호환
  • Google Play 서비스를 사용하거나 사용하지 않고 작업
  • 시스템 상태 권장사항 준수
  • 앱 UI에 작업 요청의 상태를 쉽게 표시할 수 있도록 지원

WorkManager 클래스

Worker

  • 백그라운드 스레드에서 동기식으로 작업을 실행하는 클래스
  • Kotlin 코루틴과 상호 운용되는 CoroutineWorker를 사용해 비동기 작업을 할 수 있음
  • CoroutineWorker 클래스에서 확장하고 doWork() 메서드를 재정의 -> 이 메서드에 백그라운드에서 실행하고자 하는 실제 작업 코드를 작성

WorkRequest

  • 작업 실행 요청을 나타냄
  • WorkRequest에서는 worker를 한 번 또는 주기적으로 실행해야 하는지를 정의
  • 제약 조건은 작업 실행 전에 특정 조건 충족을 요구하는 WorkRequest에 배치될 수도 있음
  • WorkRequest를 만드는 과정에서 CoroutineWorker를 전달함
  • OneTimeWorkReques : 한 번만 실행되는 WorkRequest
  • PeriodicWorkReques : 일정 주기로 반복적으로 실행되는 WorkRequest

WorkManager

  • 실제로 WorkRequest를 예약하고 실행
  • 지정된 제약 조건을 준수하면서 시스템 리소스에 부하를 분산하는 방식으로 WorkRequest를 예약

작업 체이닝

  • WorkManager 작업 체인을 사용하면 순서대로 실행되거나 동시에 실행되는 별도의 WorkerRequest를 만들 수 있음
  • 체이닝은 입력을 받아서 출력을 생성할 수 있음 -> 한 WorkRequest의 출력은 체인에 있는 다음 WorkRequest의 입력이 됨
  • WorkManagerbeginWith() 메서드를 호출하면 WorkContinuation 객체가 반환되고 체인의 첫 번째 작업 요청이 있는 WorkRequest 체인의 시작점이 생성됨
  • then() 메서드를 호출하고 WorkRequest 객체를 전달하여 이 작업 요청 체인에 추가할 수 있음
  • 작업을 시작하려면 연속 객체에서 enqueue() 메서드를 호출

예시

var continuation = workManager.beginWith(OneTimeWorkRequest.from(CleanupWorker::class.java))

// Add WorkRequest to blur the image
val blurBuilder = OneTimeWorkRequestBuilder<BlurWorker>()

// Input the Uri for the blur operation along with the blur level
blurBuilder.setInputData(createInputDataForWorkRequest(blurLevel, imageUri))

continuation = continuation.then(blurBuilder.build()) // 작업 체이닝

// Add WorkRequest to save the image to the filesystem
val save = OneTimeWorkRequestBuilder<SaveImageToFileWorker>().build()
continuation = continuation.then(save)

// 작업 실행
continuation.enqueue()

고유 작업 보장

  • beginUniqueWork()를 사용 -> Unique Work 라는 작업 처리 방식을 제공
    • String (첫 번째 매개변수) : 작업의 고유한 이름 부여 -> 이 이름을 통해서 큐에 넣거나, 조회하거나 취소할 수 있음
    • ExistingWorkPolicy 객체 (두 번째 매개변수) : 동작 방식 지정
      • KEEP : 작업 A가 실행 대기 중이거나 실행 중이면 작업 B는 WorkManager의 큐에 추가 되지않음
      • REPLACE : 작업 A를 취소하고 작업 B를 큐에 추가
      • APPEND : 작업 B를 BLOCKED 상태로 대기시키고, 작업 A가 완료되면 작업 B를 큐에 추가
      • APPEND_OR_REPLACE
    • WorkRequest (세 번째 매개변수) : 작업 지정

작업 취소

  • cancelUniqueWork() 사용 -> 매개변수로 고유 체인 이름을 전달하여 호출이 해당 이름의 예약된 작업만 취소함

작업 제약 조건

  • requiresDeviceIdle() : true 값이 전달되면 기기가 유휴 상태일 때만 작업이 실행
  • requiresStorageNotLow() : true 값이 전달되면 저장용량이 부족하지 않을 때만 작업이 실행

사용법

참조

Compose Codelab - WorkManager를 사용한 작업 예약 (7단원)

profile
코딩계의 떠오르는 태양☀️

0개의 댓글