업데이트:

카테고리:

/

태그: , ,

WorkManager

프로세스의 종료 여부와 상관없이 실행되지만, 언제 실행될 지를 모른다.

그렇기에 로컬 서버 동기화, 이미지 업로드 등의 작업에 적합하다.

필요한 요소 3가지

  1. Worker
    • 백그라운드에서 실행될 작업 정의
    • doWork() 메서드를 활용해 백그라운드에서 실행될 동작을 집어넣는다.
    • 응답 결과에 따라 상태값을 반환하고 결과에 따라 이후 동작을 결정할 수 있다.
  2. WorkRequest
    • Worker에서 정의된 task를 작동시키기 위한 request를 정의
    • 생성할 때 마다 반복여부와 제약사항의 내용을 담는다.
      • OneTimeWorkerRequest : 1번만 실행
      • PeriodicWorkRequest **: 일정 기간마다 Worker를 실행 (최소간격 15분)
  3. WorkManager
    • WorkRequest의 순서를 조정하고, 관리하고, 실행한다.
    • 인스턴스를 받아와 WorkRequest를 큐에 추가해 실행한다.
// WorkRequest 작성
class RefreshDataWorker(appContext: Context, params: WorkerParameters): CoroutineWorker(appcontext, params) {
	override suspend fun doWork(): Result {
		// repository에 DB를 넣고 갱신을 시도
		val database = getDatabase(applicationContext)
		val repository = videoRepository(database) 

		try {
			repository.refreshVideos()
		} catch(e: HttpException) {
			return Result.retry()
		}
		return Result.Success()
	}
}

// 1번
val workRequest = OneTimeWorkerRequestBuilder<RefreshDataWorker>().build()
// 일정 주기로 반복
val periodWorkReqeust = PeriodicWorkRequestBuilder<RefreshDataWorker>(15, TimeUnit.MINUTES).build()

// WorkManager 
private val workManager = WorkManager.getInstance(application)

workManager.enqueue(workRequest)