Open12
AndroidのWorkManagerのお勉強
WorkManagerを使うと単に処理を実行するだけではなく
- 「Wifiに繋いでる時だけ」「保存容量が○○GB以上の時」「充電○%以上」のような条件を指定してその条件になるまで待ってから実行する
- 並列実行と順次実行
みたいなより複雑な処理の制御ができそう。
重い処理をする時に使えそう。
アプリが閉じられても続けられるみたい。
例)
- ニュース記事を定期的に照会して更新する
- 画像にフィルタしたり保存したり
今現状では2.8.1が最新版だった
- Worker(CoroutineWorker) ... タスクを表すのかな?処理を
doWork()
に書く - WorkRequest ... 実行のリクエスト。充電やネットワークなどの制約は
Constraints
としてこいつにつけるらしい - WorkManager ... 実際にWorkRequestを処理するやつ。
なんか画像処理系の関数でごちゃついてわかんなくなりそう
実装方法のまとめ
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()
これで
- reqFirst
- reqSecond1 と reqSecond2 (並列で)
- reqThird
- ネットワークにつながるまで待ってから実行
の順で実行される
記事にまとめた