WorkManager ?
안드로이드 Jetpack 라이브러리 일부로, 백그라운드에서 실행되는 작업을 관리하는 도구입니다.
주로, 데이터 동기화, 데이터베이스 백업, 로그 업로드 등의 작업을 백그라운드에서 주기적으로 실행하고 싶을 때 유용합니다.
사용
implementation("androidx.work:work-runtime-ktx:2.7.1")
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에서 실행할 작업은 Worker
클래스를 사용하여 정의 합니다. doWork()
메서드는 WorkManager에서 제공하는 백그라운드 스레드에서 비동기적으로 실행됩니다. doWork()
내부에 백그라운드로 실행할 작업을 구현해주면 됩니다.
doWork()
에서 반환된 Result
는 작업의 성공 여부를 알려주며, 실패한 경우 WorkManager 서비스에 작업을 재시도해야 하는지 알려줍니다.
val uploadWorkRequest: WorkRequest =
OneTimeWorkRequestBuilder<UploadWorker>()
.build()
실행을 위해 WorkManager 서비스로 예약합니다. 주기적으로 실행 할 수 있고, 한 번만 실행 되도록 예약할 수 있습니다. 위 예제는 한 번만 실행되도록 한 예제입니다.
주기적으로 실행되도록 예약하려면 아래와 같이 하면 됩니다.
val myWork = PeriodicWorkRequest.Builder(
GetCoinPriceRecentContractedWorkManager::class.java,
15,
TimeUnit.MINUTES
).build()
PeriodicWorkRequest.Builder()
는 주기적인 작업을 생성하기 위한 빌더 객체를 생성합니다.
15
는 작업의 반복 주기를 나타냅니다.
TimeUnit.MINUTES
는 반복 주기의 시간 단위를 나타냅니다.
WorkManager
.getInstance(myContext)
.enqueue(uploadWorkRequest)
enqueue()
메서드를 사용하여 WorkRequest
를 WorkManager
에 제출합니다.
다음과 같이 제약을 걸어어 제출할 수도 있습니다.
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"GetCoinPriceRecentContractedWorkManager",
ExistingPeriodicWorkPolicy.KEEP,
myWork
)
enqueueUniquePeriodicWork()
는 주기적인 작업을 예약하는 메서드입니다. 이 메서드는 중복되는 작업을 방지하기 위해 작업을 고유하게 식별하는 데 사용됩니다.
GetCoinPriceRecentContractedWorkManager
는 작업의 고유한 이름 입니다.
ExistingPeriodicWorkPolicy.KEEP
는 작업이 이미 예약되어 있는 경우에 대한 정책입니다. KEEP
은 기존 작업을 유지하고 새로운 작업을 추가하지 않음을 의미합니다.
myWork
는 앞에서 생성한 PeriodicWorkRequest 를 전달합니다.
참고
https://developer.android.com/topic/libraries/architecture/workmanager/basics?hl=ko