【Kotlin/Android】CoroutineWorkerの使い方!WorkManager
この記事からわかること
- Android Studio/KotlinのWorkManagerの使い方
- CoroutineWorkerを実装する方法
- 非同期処理をWorkManagerで使用するには?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
CoroutineWorkerとは?
CoroutineWorkerはWorkManagerライブラリに含まれておりCoroutine(Kotlin Coroutines)を使用して非同期タスクを実行するためのWorkerのサブクラスです。通常のWorkerクラスではKotlin Coroutinesに対応していないのでKotlin Coroutinesを使用した非同期タスクを絡ませたい場合はCoroutineWorkerを使用します。
実装方法
CoroutineWorker
は独自のワーカーサブクラスを実装する際にWorker
の代わりに継承させます。Worker
では通常のメソッドだったdoWork
がCoroutineWorker
ではsuspend
が付与されています。
suspend
が付与されていることでdoWork
メソッド内で別の非同期処理であるsuspend関数をそのまま実行することができます。
class MyCoroutineWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
Log.d("Worker", "開始")
// 5秒かかる処理を待機してデータを取得できる
val data = fetchDataFromRemote()
Log.d("Worker", "終了 ${data}" )
return Result.success()
}
suspend fun fetchDataFromRemote(): String {
delay(5000) // 5秒後
return "リモートサーバーからフェッチ"
}
companion object {
private const val INPUT_STRING_KEY = "INPUT_STRING_KEY"
public fun createRequest(text: String): WorkRequest =
OneTimeWorkRequest.Builder(MyCoroutineWorker::class.java)
.setInputData(createData(text))
.build()
private fun createData(text: String): Data = Data.Builder()
.putString("INPUT_STRING_KEY", text)
.build()
}
}
呼び出す際は非同期処理であることを意識する必要はなく通常のWorkerのようにenqueue
メソッドで実行することができます。
// WorkRequestを作成し
val workRequest = MyCoroutineWorker.createRequest("Hello World")
// WorkManagerにWorkRequestをエンキュー
WorkManager.getInstance(this).enqueue(workRequest)
CoroutineWorkerを使用しなくてもCoroutine処理を実装することはできますが、だいぶスッキリ記述できるのは大きなメリットですね。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。