Open12

AndroidのWorkManagerのお勉強

てべすてんてべすてん

WorkManagerを使うと単に処理を実行するだけではなく

  • 「Wifiに繋いでる時だけ」「保存容量が○○GB以上の時」「充電○%以上」のような条件を指定してその条件になるまで待ってから実行する
  • 並列実行と順次実行

みたいなより複雑な処理の制御ができそう。

重い処理をする時に使えそう。

https://developer.android.com/codelabs/basic-android-kotlin-compose-workmanager?hl=ja&continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-compose-unit-7-pathway-1%3Fhl%3Dja%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-compose-workmanager#3

てべすてんてべすてん

例)

  • ニュース記事を定期的に照会して更新する
  • 画像にフィルタしたり保存したり
てべすてんてべすてん
  • Worker(CoroutineWorker) ... タスクを表すのかな?処理を doWork() に書く
  • WorkRequest ... 実行のリクエスト。充電やネットワークなどの制約は Constraints としてこいつにつけるらしい
  • WorkManager ... 実際にWorkRequestを処理するやつ。

https://developer.android.com/codelabs/basic-android-kotlin-compose-workmanager?hl=ja&continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-compose-unit-7-pathway-1%3Fhl%3Dja%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-compose-workmanager#6

てべすてんてべすてん

実装方法のまとめ

Worker

class HogeWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) {
  override suspend fun doWork(): Result {
    // 1. inputDataで前WorkerのDataオブジェクトにアクセスする
    val input1 = inputData.getString(KEY_INPUT_1)
    // 2. 成功時は
    Result.success()
    // Dataを返すこともできる
    Result.success(
      workDataOf(KEY_OUTPUT_1 to output1)
    )
    /*
    逆に失敗時は
    Result.faliure()
    */
  }
}
  • Worker.doWork に処理を記述して
  • Worker.inputData で前Workerの(outputされた)Dataオブジェクトにアクセス
  • Result.success(workDataOf()) でDataオブジェクトを返す

Workerを実行する

val workManager = WorkManager.getInstance(context)


val reqFirst = OneTimeWorkRequestBuilder<FirstWorker>().build()
val reqSecond1 = OneTimeWorkRequestBuilder<Second1Worker>().build()
val reqSecond2 = OneTimeWorkRequestBuilder<Second2Worker>().build()
val reqThird = OneTimeWorkRequestBuilder<ThirdWorker>()
  .setConstraints(
    Constraints.Builder()
      .setRequiredNetworkType(NetworkType.CONNECTED). // ネットワークにつながっている時
      .build()
  )
  .build()

workManager
  .beginWith(reqFirst)
  .then(list(reqSecond1,reqSecond2))
  .then(reqThird)
  .enqueue()
てべすてんてべすてん

これで

  1. reqFirst
  2. reqSecond1 と reqSecond2 (並列で)
  3. reqThird
  • ネットワークにつながるまで待ってから実行

の順で実行される