はじめに
はじめまして!
DMMブックス・アプリチームの佐藤です。現在はAndroidアプリを開発しています。
今回はWorkManagerのデータ遷移とObserveのことを寄稿しようと思います。
WorkManagerとは
WorkManagerとは、非同期で定期的なスケジュール実行を提供しているAPIです。
通常のタスク実行だとできないアプリのバックグラウンド時にも、設定したスケジュールを実行してくれます。
もちろん、一回限りのスケジュールの実行も可能です。
WorkManagerへのデータの遷移
非同期でアプリ起動時以外にも実行してくれるWorkManagerへのデータ遷移は、引数やIntentは利用しません。
WorkManagerへのRequestの中にSetInputData()があり、そこに実行するスケジュールで利用するデータを格納します。
KeyValue型なのでデータの格納、取得にはKeyが必要になります。
重要なのがDataではsetSeriealizeやsetParcelableを利用できないため、基本の型に変換することが必要になります。
ブックスアプリでは書籍アイテムクラスをJsonStringにすることで解決しました。
WorkManagerで実行するタスクの実装部分、Workerクラスでは、Inputデータを参照することでデータを受け取ることができます。
Workerに送る際にはString化されているので、復元をすることで、PreferenceやDBを利用しなくてもWorkerへのデータ遷移ができます。
WorkManagerからのデータ遷移を監視
WorkManagerはバックグラウンドで非同期実行できる機能なので、Listenerなどでは処理結果の返却を行うことはできません。
そのためWorkManagerではキューに入っているWorkerを取得して監視するLiveDataを入手することができます。
ブックスアプリでは、設定したTAGや書籍アイテムの識別KeyからキューのWorker監視LiveDataを取得しました。
監視する側の呼び出しは、通常のLiveDataと同じように扱う形で問題ありません。
WorkInfoクラスの中にisFinishedやoutputDataなどの情報が入っているので、用途に応じて使ってください。
一点だけ注意点があるとすれば、呼び出すものはキューに入っているWorkerになるので、キューに入っていないWorkerを監視することはできません。
監視を呼び出すタイミングは、よく考えて実装しましょう。
ブックスアプリではWorkManagerへのRequest処理の後にObserverの取得を行なっています。
監視しているLiveDataへのデータ遷移
WorkerInfoは監視しているLiveDataに送られますが、デフォルトデータ以外に何かを送りたい場合は、Inputと同様にOutputを設定する必要があります。
Result.success()やResult.failure()の引数に値を設定することで、Outputデータとして監視先に送ることができます。
また今回は利用しませんでしたが、setProgress()という途中経過を送信するメソッドを利用することで、「Workerが終了していない状態のデータを送信したい」という時に重宝します。
設定したデータはWorkInfoの中にResultならoutputData、setProgressならprogressに格納されます。
こちらもInputと同様にsetSeriealizeやsetParcelableを利用できないため、ブックスアプリでは変換をして利用しています。
まとめ
今回は実際にブックスアプリで利用するWorkManagerの使い方を記載しました。
これ以外にも端末再起動時に行うようなスケジュールを設定したりすることができます。
WorkManagerはバックグラウンドでの非同期処理を行なってくれるので、今まで以上にいろいろなことが可能になります。
IntentやBundleといったActivityやFragmentとは違うデータのやりとりが必要になりますが、使いこなせばアプリの利用者にも使い勝手のいい機能が実装できます。
バックグラウンドで行う非同期処理を上手く置き換えることで、アプリの品質もあげやすくなるでしょう。
最後に
DMMで購入した書籍が読めるDMMブックスアプリをよろしくお願いします。
https://book.dmm.co.jp/info_bookviewer.html