[안드로이드] WorkManager

이상욱·2022년 12월 24일
0

안드로이드

목록 보기
14/17
post-thumbnail
post-custom-banner

안드로이드의 백그라운드 작업을 처리하기 위해 만들어진 WorkManager를 알아보겠습니다.

안드로이드의 백그라운드 작업

  • 실행 시험에 따른 분류
    - Exact Timing : 즉시 처리되어야 하는 작업
    - Deferrable : 처리를 위한 조건이 만족될 때 까지 기다릴 수 있는 작업
  • 실행 완료 여부에 따른 분류
    - Best-Effort : 처리를 위해 노력하지만 최소될 수도 있는 작업
    - Guaranteed Execution : 앱이 종료되거나 기기가 재부팅되어도 수행되어야 하는 작업

✅ WorkManager

실행이 보장되며 제약조건을 붙일 수 있습니다. 예를 들어 네트워크 연결 시에만 작업이 처리되도록 할 수 있습니다.
구글 플레이 서비스와 관계없이 동작하고 작업이 실행/대기 중인지, 성공/실패 했는지 등의 상태조회를 할 수 있습니다.

작업 정의

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

WorkManager제약 조건 설정

val constraints = Constraints.Builder()
	.setRequiredNetworkType(NetworkType.UNMETERED)
    .setRequiresCharging(true)
    .build()
    
val uploadWorkRequest : WorkRequest = 
	OneTimeWorkRequestBuilder<UploadWorker>()
    	.setConstraints(constraints)
        .build()

WorkRequest 제출

WorkManager
	.getInstance(myContext)
    .enqueue(uploadWorkRequest)

WorkManager의 구조

Work States 확인하기

// by id
workManager.getWorkInfoById(syncWorker.id) // ListenableFuture<WorkInfo>

// by name
workManager.getWorkInfosForUniqueWork("sync") // ListenableFuture<List<WorkInfo>>

// by tag
workManager.getWorkInfosByTag("syncTag") // ListenableFuture<List<WorkInfo>>

1회성 작업 상태

one-time 작업 요청의 경우 작업이 ENQUEUED 상태에서 시작됩니다.

ENQUEUED 상태에서 작업은 Constraints 및 초기 지연 타이밍 요구사항이 충족되는 즉시 실행될 수 있습니다. 여기에서 작업은 RUNNING 상태로 이동하고 작업 결과에 따라 SUCCEEDED, FAILED 또는 결과가 retry라면 다시 ENQUEUED로 이동할 수 있습니다. 프로세스의 어떤 시점에서든 작업을 취소할 수 있고 작업은 취소 시점에서 CANCELLED 상태로 이동합니다.

SUCCEEDED, FAILED, CANCELLED는 모두 작업의 최종 상태를 나타냅니다. 작업이 이러한 상태에 있다면 WorkInfo.State.isFinished()가 true를 반환합니다.

주기적 작업 상태
주기적 작업의 경우 최종 상태는 CANCELLED 하나만 있습니다. 주기적 작업은 종료되지 않기 때문입니다. 실행할 때마다 결과와 관계없이 작업이 다시 예약됩니다. 그림 2는 주기적 작업의 상태 다이어그램을 간략하게 보여줍니다.

profile
항상 배우고 성장하는 안드로이드 개발자
post-custom-banner

0개의 댓글