#1 이전 글
위 게시글의 완성된 앱을 일부 수정해서, 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의 큐에 넣을 수 있다. ExistingWorkPolicy 및 ExistingPeriodicWorkPolicy에 대한 설명은 위 코드의 주석을 참조하자.
#3 요약
여러 개가 있을 필요 없는 WorkRequest를 관리한다.
#4 완성된 앱
'깨알 개념 > Android' 카테고리의 다른 글
[Android] WorkManager - 제약 조건 (Constraints) (0) | 2024.06.17 |
---|---|
[Android] WorkManager - 인자 전달 및 데이터 반환 (0) | 2024.06.17 |
[Android] WorkManager - 기초 (0) | 2024.06.17 |
[Android] WorkManager - 개요 (0) | 2024.06.14 |
[Android] Notifications - Action 버튼 클릭 시 알림 Cancel (0) | 2024.06.14 |