๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/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์˜ ํ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ExistingWorkPolicy ๋ฐ ExistingPeriodicWorkPolicy์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์œ„ ์ฝ”๋“œ์˜ ์ฃผ์„์„ ์ฐธ์กฐํ•˜์ž.

 

#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