#1 ์ด์ ๊ธ
[Android] WorkManager - ๊ธฐ์ด
#1 ์ด์ ๊ธ [Android] WorkManager - ๊ฐ์#1 WorkManager๋ '์ง์ฐ ๊ฐ๋ฅํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ '์ ๊ด๋ฆฌ์ WorkManager๋ฅผ ์ฌ์ฉํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ - Kotlin | Android DevelopersAndroid์๋ ๋ณด์ฅ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ํ ๋ค
kenel.tistory.com
์ ๊ฒ์๊ธ์ ์์ฑ๋ ์ฑ์ ์ผ๋ถ ์์ ํด์, Worker์ ์ธ์๋ฅผ ์ ๋ฌํ๊ณ Worker๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ๋ฐ์ ๋ณธ๋ค.
#2 ์ฝ๋ ์์
#2-1 MainActivity - setOneTimeWorkRequest()
...
class MainActivity : AppCompatActivity() {
companion object {
const val KEY_LUCKY_NUMBER= "key_lucky"
}
override fun onCreate(savedInstanceState: Bundle?) {
...
}
private fun setOneTimeWorkRequest() {
// Worker์ ์ ๋ฌํ Data ๊ฐ์ฒด ๋ง๋ค๊ธฐ
val inputData: Data = Data
.Builder()
.putInt(KEY_LUCKY_NUMBER, 777)
.build()
// WorkRequest ๊ฐ์ฒด ๋ง๋ค๊ธฐ
val uploadRequest = OneTimeWorkRequest
.Builder(UploadWorker::class.java)
.setInputData(inputData)
.build()
// WorkManager ๊ฐ์ฒด์ ์์
ํ(Job queue)์ WorkRequest ๋ฑ๋ก
...
// WorkInfo๋ ์์
์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด.
// WorkManager.getWorkInfoByIdLiveData()๋ LiveData<WorkInfo>๋ฅผ ๋ฐํ.
...
workInfo.observe(this, Observer {
...
if(it.state.name == "SUCCEEDED") {
val outputData = it.outputData
Log.i("interfacer_han", "(${this::class.simpleName}) UploadWorker's output: ${outputData.getString(UploadWorker.KEY_UPLOAD_WORKER)}")
}
})
}
private fun setPeriodicWorkRequest() {
...
}
}
WorkManager์์ ์ธ์์ ์ ๋ฌ ๋ฐ ๋ฐ์ดํฐ ๋ฐํ์ androidx.work.Data๋ก ํ๋ค. androidx.work.Data๋ฅผ importํ๊ณ Data ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด Request์ ๋ฃ๋๋ค. ๊ทธ๋ฆฌ๊ณ LiveData.observe() ๋ถ๋ถ์ ์์ ๊ฐ์ด ์์ ํ๋ค. WorkInfo.outputData๋ WorkRequest๊ฐ ๋๋๊ธฐ ์ ์๋ ์๋ฌด๋ฐ ๊ฐ์ด ๋ค์ด์์ง ์๋ค. ๋ฐ๋ผ์ if๋ฌธ์ ๋ฃ์ด ์ํ๋ฅผ ํ์ธํ๋ค.
#2-2 MainActivity - setPeriodicWorkRequest()
...
class MainActivity : AppCompatActivity() {
companion object {
const val KEY_LUCKY_NUMBER= "key_lucky"
}
override fun onCreate(savedInstanceState: Bundle?) {
...
}
private fun setOneTimeWorkRequest() {
...
}
private fun setPeriodicWorkRequest() {
// Worker์ ์ ๋ฌํ Data ๊ฐ์ฒด ๋ง๋ค๊ธฐ
val inputData: Data = Data
.Builder()
.putInt(KEY_LUCKY_NUMBER, 777)
.build()
// WorkRequest ๊ฐ์ฒด ๋ง๋ค๊ธฐ
val downloadRequest = PeriodicWorkRequest
.Builder(DownloadWorker::class.java, 15, TimeUnit.MINUTES) // ์๋๋ก์ด๋์์ ํ์ฉํ๋ PeriodicWorkRequest์ ์ต์ ์ฃผ๊ธฐ๋ 15๋ถ์ด๋ค.
.setInputData(inputData)
.build()
// WorkManager ๊ฐ์ฒด์ ์์
ํ(Job queue)์ WorkRequest ๋ฑ๋ก
...
// WorkInfo๋ ์์
์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด.
// WorkManager.getWorkInfoByIdLiveData()๋ LiveData<WorkInfo>๋ฅผ ๋ฐํ.
...
workInfo.observe(this, Observer {
...
// ์ด if๋ฌธ ์์ ์ฝ๋๋ ์์ํ ์คํ๋์ง ๋ชปํ๋ค.
if(it.state.name == "SUCCEEDED") {
val outputData = it.outputData
Log.i("interfacer_han", "(${this::class.simpleName}) DownloadWorker's output: ${outputData.getString(DownloadWorker.KEY_DOWNLOAD_WORKER)}")
}
})
}
}
#2-1๊ณผ ๊ฐ์ ๋งฅ๋ฝ์ผ๋ก ์ฝ๋๋ฅผ ์์ ํ๋ค. ํ์ง๋ง, #2-1์์์๋ ๋ฌ๋ฆฌ setPeriodicWorkRequest()์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ๋ฐ์ ์ ์๋ค. ์๋ํ๋ฉด PeriodicWorkRequest๋ ๋๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค (์ด ๊ฒ์๊ธ์ #4-3 ์ฐธ์กฐ). WorkInfo.outputData๋ WorkRequest๊ฐ ๋๋๊ธฐ ์ ์๋ ์๋ฌด๋ฐ ๊ฐ์ด ๋ค์ด์์ง ์๋ค. ๋ฐ๋ผ์ WorkInfo.outputData๋ ํญ์ ๋น์ด์๊ฒ ๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก PeriodicWorkRequest๋ก๋ถํฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ๋ฐ์ ๊ฒ์ ๊ธฐ๋ํ ์ ์์ผ๋ฉฐ, ํด๋น Request์ ๋ค์ด์๋ Worker์์ ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ ๊ฐ์ ๋ฃ๋ ์์ผ๋ก ์ฐํํด์ผ ํ๋ค.
#2-3 UploadWorker.kt
// package com.example.argumentsandreturn
import android.content.Context
import android.util.Log
import androidx.work.Data
import androidx.work.Worker
import androidx.work.WorkerParameters
import java.text.SimpleDateFormat
import java.util.Date
class UploadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
companion object {
const val KEY_UPLOAD_WORKER = "key_upload_worker"
}
override fun doWork(): Result {
try {
Log.i(...)
val inputtedData = inputData.getInt(MainActivity.KEY_LUCKY_NUMBER, -1)
Log.i(...)
for (i in 0..100) {
...
}
val outputData = Data
.Builder()
.putString(KEY_UPLOAD_WORKER, "Hello, MainActivity! I'm UploadWorker")
.build()
Log.i(...)
return Result.success(outputData)
} catch (e: Exception) {
return Result.failure()
}
}
...
}
#2-1์ ๋ฐฉํฅ๋ง ๋ฐ๋๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
#2-4 DownloadWorker.kt
...
class DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
companion object {
const val KEY_DOWNLOAD_WORKER = "key_download_worker"
}
override fun doWork(): Result {
try {
...
val outputData = Data
.Builder()
.putString(KEY_DOWNLOAD_WORKER, "Hello, MainActivity! I'm DownloadWorker.")
.build()
...
return Result.success(outputData)
} catch (e: Exception) {
return Result.failure()
}
}
...
}
์์ ๋ถ๋ถ๊ณผ putString() ๋ถ๋ถ์ ์ ์ธํ๊ณ , #2-3๊ณผ ์์ ํ ๋์ผํ๊ฒ ์์ ํ๋ค.
#3 ์๋ ํ์ธ
#3-1 'One Time Request' ๋ฒํผ์ ํด๋ฆญํ์ ๋์ ๋ก๊ทธ ๋ฉ์์ง
(MainActivity) UploadWorker's state: ENQUEUED
(UploadWorker) Started at 2024/06/17 08:31:33
(UploadWorker) Inputted data: 777
(UploadWorker) Progress: 0/100
(UploadWorker) Progress: 1/100
(UploadWorker) Progress: 2/100
(UploadWorker) Progress: 3/100
(UploadWorker) Progress: 4/100
(UploadWorker) Progress: 5/100
(UploadWorker) Progress: 6/100
(UploadWorker) Progress: 7/100
(UploadWorker) Progress: 8/100
(UploadWorker) Progress: 9/100
(UploadWorker) Progress: 10/100
(UploadWorker) Progress: 11/100
(UploadWorker) Progress: 12/100
(UploadWorker) Progress: 13/100
(MainActivity) UploadWorker's state: RUNNING
(UploadWorker) Progress: 14/100
(UploadWorker) Progress: 15/100
(UploadWorker) Progress: 16/100
(UploadWorker) Progress: 17/100
(UploadWorker) Progress: 18/100
(UploadWorker) Progress: 19/100
(UploadWorker) Progress: 20/100
(UploadWorker) Progress: 21/100
(UploadWorker) Progress: 22/100
(UploadWorker) Progress: 23/100
(UploadWorker) Progress: 24/100
(UploadWorker) Progress: 25/100
(UploadWorker) Progress: 26/100
(UploadWorker) Progress: 27/100
(UploadWorker) Progress: 28/100
(UploadWorker) Progress: 29/100
(UploadWorker) Progress: 30/100
(UploadWorker) Progress: 31/100
(UploadWorker) Progress: 32/100
(UploadWorker) Progress: 33/100
(UploadWorker) Progress: 34/100
(UploadWorker) Progress: 35/100
(UploadWorker) Progress: 36/100
(UploadWorker) Progress: 37/100
(UploadWorker) Progress: 38/100
(UploadWorker) Progress: 39/100
(UploadWorker) Progress: 40/100
(UploadWorker) Progress: 41/100
(UploadWorker) Progress: 42/100
(UploadWorker) Progress: 43/100
(UploadWorker) Progress: 44/100
(UploadWorker) Progress: 45/100
(UploadWorker) Progress: 46/100
(UploadWorker) Progress: 47/100
(UploadWorker) Progress: 48/100
(UploadWorker) Progress: 49/100
(UploadWorker) Progress: 50/100
(UploadWorker) Progress: 51/100
(UploadWorker) Progress: 52/100
(UploadWorker) Progress: 53/100
(UploadWorker) Progress: 54/100
(UploadWorker) Progress: 55/100
(UploadWorker) Progress: 56/100
(UploadWorker) Progress: 57/100
(UploadWorker) Progress: 58/100
(UploadWorker) Progress: 59/100
(UploadWorker) Progress: 60/100
(UploadWorker) Progress: 61/100
(UploadWorker) Progress: 62/100
(UploadWorker) Progress: 63/100
(UploadWorker) Progress: 64/100
(UploadWorker) Progress: 65/100
(UploadWorker) Progress: 66/100
(UploadWorker) Progress: 67/100
(UploadWorker) Progress: 68/100
(UploadWorker) Progress: 69/100
(UploadWorker) Progress: 70/100
(UploadWorker) Progress: 71/100
(UploadWorker) Progress: 72/100
(UploadWorker) Progress: 73/100
(UploadWorker) Progress: 74/100
(UploadWorker) Progress: 75/100
(UploadWorker) Progress: 76/100
(UploadWorker) Progress: 77/100
(UploadWorker) Progress: 78/100
(UploadWorker) Progress: 79/100
(UploadWorker) Progress: 80/100
(UploadWorker) Progress: 81/100
(UploadWorker) Progress: 82/100
(UploadWorker) Progress: 83/100
(UploadWorker) Progress: 84/100
(UploadWorker) Progress: 85/100
(UploadWorker) Progress: 86/100
(UploadWorker) Progress: 87/100
(UploadWorker) Progress: 88/100
(UploadWorker) Progress: 89/100
(UploadWorker) Progress: 90/100
(UploadWorker) Progress: 91/100
(UploadWorker) Progress: 92/100
(UploadWorker) Progress: 93/100
(UploadWorker) Progress: 94/100
(UploadWorker) Progress: 95/100
(UploadWorker) Progress: 96/100
(UploadWorker) Progress: 97/100
(UploadWorker) Progress: 98/100
(UploadWorker) Progress: 99/100
(UploadWorker) Progress: 100/100
(UploadWorker) Finished at 2024/06/17 08:31:33
(MainActivity) UploadWorker's state: SUCCEEDED
(MainActivity) UploadWorker's output: Hello, MainActivity! I'm UploadWorker
#3-2 'Periodic Request' ๋ฒํผ์ ํด๋ฆญํ์ ๋์ ๋ก๊ทธ ๋ฉ์์ง
(MainActivity) DownloadWorker's state: ENQUEUED
(DownloadWorker) Started at 2024/06/17 08:33:28
(DownloadWorker) Inputted data: 777
(DownloadWorker) Progress: 0/100
(DownloadWorker) Progress: 1/100
(DownloadWorker) Progress: 2/100
(DownloadWorker) Progress: 3/100
(DownloadWorker) Progress: 4/100
(DownloadWorker) Progress: 5/100
(DownloadWorker) Progress: 6/100
(DownloadWorker) Progress: 7/100
(DownloadWorker) Progress: 8/100
(DownloadWorker) Progress: 9/100
(DownloadWorker) Progress: 10/100
(DownloadWorker) Progress: 11/100
(DownloadWorker) Progress: 12/100
(DownloadWorker) Progress: 13/100
(DownloadWorker) Progress: 14/100
(DownloadWorker) Progress: 15/100
(DownloadWorker) Progress: 16/100
(DownloadWorker) Progress: 17/100
(DownloadWorker) Progress: 18/100
(DownloadWorker) Progress: 19/100
(DownloadWorker) Progress: 20/100
(DownloadWorker) Progress: 21/100
(DownloadWorker) Progress: 22/100
(DownloadWorker) Progress: 23/100
(DownloadWorker) Progress: 24/100
(DownloadWorker) Progress: 25/100
(DownloadWorker) Progress: 26/100
(DownloadWorker) Progress: 27/100
(DownloadWorker) Progress: 28/100
(DownloadWorker) Progress: 29/100
(DownloadWorker) Progress: 30/100
(DownloadWorker) Progress: 31/100
(DownloadWorker) Progress: 32/100
(DownloadWorker) Progress: 33/100
(DownloadWorker) Progress: 34/100
(DownloadWorker) Progress: 35/100
(DownloadWorker) Progress: 36/100
(DownloadWorker) Progress: 37/100
(DownloadWorker) Progress: 38/100
(DownloadWorker) Progress: 39/100
(DownloadWorker) Progress: 40/100
(DownloadWorker) Progress: 41/100
(DownloadWorker) Progress: 42/100
(DownloadWorker) Progress: 43/100
(DownloadWorker) Progress: 44/100
(DownloadWorker) Progress: 45/100
(DownloadWorker) Progress: 46/100
(DownloadWorker) Progress: 47/100
(DownloadWorker) Progress: 48/100
(DownloadWorker) Progress: 49/100
(DownloadWorker) Progress: 50/100
(DownloadWorker) Progress: 51/100
(DownloadWorker) Progress: 52/100
(DownloadWorker) Progress: 53/100
(DownloadWorker) Progress: 54/100
(DownloadWorker) Progress: 55/100
(DownloadWorker) Progress: 56/100
(DownloadWorker) Progress: 57/100
(DownloadWorker) Progress: 58/100
(DownloadWorker) Progress: 59/100
(DownloadWorker) Progress: 60/100
(DownloadWorker) Progress: 61/100
(DownloadWorker) Progress: 62/100
(DownloadWorker) Progress: 63/100
(DownloadWorker) Progress: 64/100
(DownloadWorker) Progress: 65/100
(DownloadWorker) Progress: 66/100
(DownloadWorker) Progress: 67/100
(DownloadWorker) Progress: 68/100
(DownloadWorker) Progress: 69/100
(DownloadWorker) Progress: 70/100
(DownloadWorker) Progress: 71/100
(DownloadWorker) Progress: 72/100
(DownloadWorker) Progress: 73/100
(MainActivity) DownloadWorker's state: RUNNING
(DownloadWorker) Progress: 74/100
(DownloadWorker) Progress: 75/100
(DownloadWorker) Progress: 76/100
(DownloadWorker) Progress: 77/100
(DownloadWorker) Progress: 78/100
(DownloadWorker) Progress: 79/100
(DownloadWorker) Progress: 80/100
(DownloadWorker) Progress: 81/100
(DownloadWorker) Progress: 82/100
(DownloadWorker) Progress: 83/100
(DownloadWorker) Progress: 84/100
(DownloadWorker) Progress: 85/100
(DownloadWorker) Progress: 86/100
(DownloadWorker) Progress: 87/100
(DownloadWorker) Progress: 88/100
(DownloadWorker) Progress: 89/100
(DownloadWorker) Progress: 90/100
(DownloadWorker) Progress: 91/100
(DownloadWorker) Progress: 92/100
(DownloadWorker) Progress: 93/100
(DownloadWorker) Progress: 94/100
(DownloadWorker) Progress: 95/100
(DownloadWorker) Progress: 96/100
(DownloadWorker) Progress: 97/100
(DownloadWorker) Progress: 98/100
(DownloadWorker) Progress: 99/100
(DownloadWorker) Progress: 100/100
(DownloadWorker) Finished at 2024/06/17 08:33:28
(MainActivity) DownloadWorker's state: ENQUEUED
์ดํ ์๋ต
#4 ์์ฝ
๋๋๋ ๊ฒ ๊ฐ๋ฅํ WorkRequest์๊ฒ์๋ง ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ฐํ๋ฐ์ ์ ์๋ค.
#5 ์์ฑ๋ ์ฑ
android-practice/work-manager/ArgumentsAndReturn at master · Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] WorkManager - ์์ ์ฐ์ํ๊ธฐ(Chaining) (0) | 2024.06.17 |
---|---|
[Android] WorkManager - ์ ์ฝ ์กฐ๊ฑด (Constraints) (0) | 2024.06.17 |
[Android] WorkManager - enqueueUniqueWork() (0) | 2024.06.17 |
[Android] WorkManager - ๊ธฐ์ด (0) | 2024.06.17 |
[Android] WorkManager - ๊ฐ์ (0) | 2024.06.14 |