깨알 개념/Android

[Android] WorkManager - enqueueUniqueWork()

interfacer_han 2024. 6. 17. 20:05

#1 이전 글

 

[Android] WorkManager - 기초

#1 이전 글 [Android] WorkManager - 개요#1 WorkManager는 '지연 가능한 백그라운드 작업'의 관리자 WorkManager를 사용한 백그라운드 작업 - Kotlin | Android DevelopersAndroid에는 보장된 백그라운드 작업을 위한 다

kenel.tistory.com

위 게시글의 완성된 앱을 일부 수정해서, WorkRequest에 이름을 붙이고, 작업을 관리해본다.

 

#2 코드 수정 - MainActivity.kt

...

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
    }

    private fun setOneTimeWorkRequest() {
        // WorkRequest 객체 만들기
        val uploadRequest = OneTimeWorkRequest
            .Builder(UploadWorker::class.java)
            .build()

        // WorkManager 객체의 작업 큐(Job queue)에 WorkRequest 등록
        /* 과거에 enqueue()했었던 동일한 '고유 이름(여기서는 "myWork1")'인 작업을 '1st 작업',
         * 지금 enqueue()하려는 작업을 '2nd 작업'이라고 할 때,
         *
         * ExistingWorkPolicy.APPEND: 1st 작업을 취소하지 않고 그 뒷 순서로 2nd 작업을 이어 붙임 (Chaining Worker에서와 같은 동작. 참조: https://kenel.tistory.com/153)
         * ExistingWorkPolicy.APPEND_OR_REPLACE:
         *     2nd 작업이 enqueue()되는 시점에, 1st 작업의 상태가 FAILED면 2nd 작업 시작 (REPLACE와 같은 동작)
         *     2nd 작업이 enqueue()되는 시점에, 1st 작업이 아직 완료(= SUCCEEDED도 FAILED도 아님)되지 않았다면 그 뒷 순서로 2nd 작업을 이어 붙임 (APPEND와 같은 동작)
         * ExistingWorkPolicy.KEEP: 아무것도 하지 않음 (2nd 작업 실행 안됨)
         * ExistingWorkPolicy.REPLACE: 1st 작업을 Cancel하고 2nd 작업 시작
         */
        workManager.enqueueUniqueWork("myWork1", ExistingWorkPolicy.APPEND_OR_REPLACE, uploadRequest)

        // WorkInfo는 작업에 대한 정보를 담은 객체.
        // WorkManager.getWorkInfoByIdLiveData()는 LiveData<WorkInfo>를 반환.
        val workInfo = workManager.getWorkInfoByIdLiveData(uploadRequest.id)
        workInfo.observe(this, Observer {
            Log.i("interfacer_han", "(${this::class.simpleName}) UploadWorker's state: ${it.state.name}")
        })
    }

    private fun setPeriodicWorkRequest() {
        // WorkRequest 객체 만들기
        val downloadRequest = PeriodicWorkRequest
            .Builder(DownloadWorker::class.java, 15, TimeUnit.MINUTES) // 안드로이드에서 허용하는 PeriodicWorkRequest의 최소 주기는 15분이다.
            .build()

        // WorkManager 객체의 작업 큐(Job queue)에 WorkRequest 등록
        /* 과거에 enqueue()했었던 동일한 '고유 이름(여기서는 "myWork2")'인 작업을 '1st 작업',
         * 지금 enqueue()하려는 작업을 '2nd 작업'이라고 할 때,
         *
         * ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE: 1st 작업을 Cancel하고 2nd 작업 시작
         * ExistingPeriodicWorkPolicy.KEEP: 아무것도 하지 않음 (2nd 작업 실행 안됨)
         * ExistingPeriodicWorkPolicy.UPDATE:
         *     1st 작업을 취소하지 않고,
         *     작업의 Parameter (참조: https://kenel.tistory.com/152)나
         *     Constraint(참조: https://kenel.tistory.com/151)가
         *     2nd 작업의 것으로 업데이트됨. 대신 2nd 작업은 실행 안됨
         * ExistingPeriodicWorkPolicy.REPLACE: Deprecated됨. 대신 UPDATE를 사용할 것
         */
        workManager.enqueueUniquePeriodicWork("myWork2", ExistingPeriodicWorkPolicy.UPDATE, downloadRequest)

        // WorkInfo는 작업에 대한 정보를 담은 객체.
        // WorkManager.getWorkInfoByIdLiveData()는 LiveData<WorkInfo>를 반환.
        val workInfo = workManager.getWorkInfoByIdLiveData(downloadRequest.id)
        workInfo.observe(this, Observer {
            Log.i("interfacer_han", "(${this::class.simpleName}) DownloadWorker's state: ${it.state.name}")
        })
    }
}

WorkManager.enqueueUniqueWork()WorkManager.enqueueUniquePeriodicWork()한 번에 하나만 활성화할 수 있는 고유한 이름의 WorkRequest를 WorkManager의 큐에 넣을 수 있다. ExistingWorkPolicyExistingPeriodicWorkPolicy에 대한 설명은 위 코드의 주석을 참조하자.

 

#3 요약

여러 개가 있을 필요 없는 WorkRequest를 관리한다.

 

#4 완성된 앱

 

android-practice/work-manager/EnqueueUniqueWork at master · Kanmanemone/android-practice

Contribute to Kanmanemone/android-practice development by creating an account on GitHub.

github.com