# WorkManager ## GDE Google Developers Experts https://developers.google.com/community/experts/ 簡単になれる(は?)ので登録!! ## WorkManager バックグラウンドタスクの実装 API Levelによる処理の分岐が必要だった. バッテリ効率かのためにDozeが入ったりとか,それでもバックグランドタスクの動きは保証しなければならない →WorkManger使おう! API 14以降なら全部使える ただし,実行タイミングは厳密じゃなくてもよいが,かならず実行したいタスクの実行に使えるよ! ### 注意! データストア代わりに使用しない. - データのインスタンスは10KBまでしかない 表示中のアプリのView更新とかでは使わない! ### 使い所 https://www.youtube.com/watch?v=pe_yqM16hPQ https://developer.android.com/guide/background ## 実際の書き方 - Worker - バックグラウンドで実際に実行する処理を書く - バックグランドで実行させたいコードを`onWrok`に書く - WorkRequest - OneTimeWorkRequest - PeriodWorkRequest - これらのリクエストをworkManagerにenqueueすると実行される - Constraints - 発火の条件もつけられる!!! - setConstraintsするだけ - ネットワークとかバッテリ残量とかいろいろある - Backoff Policy - リトライ時の再試行のポリシー - だんだん長くなるのと指定した時間だけリニアにするものがある - setBackOffPolicyするだけ - IDとTag - UUID形式のIDが自動的に割り振られる!!! - `someWork.id`で取得できる - 開発者がTagを割り振ることもできる. - このTagを使ってLiveDataを作ることも可能. - WorkInfo - LiveDataとして取り出すことも可能. ## Workerのスレッド AsyncTaskのThreadPoolExecutorと同じ設定.Fixedなスレッドプールを持つExecutorが用いられる. 初期化時にExecutorをカスタマイズすることも可能 ## Chain スケジューリング時に複数のWorkerをつなげることができる. 実態はWorkContinuation, workManager.beginWith()で初めて,then()でつなげる.Promiseみたいだね beginWith()はlistを引数として取ることも可能!!! ## InputMerger 複数の入力タスクの結果を1つのデータにマージすることもできる!!! OverwritingInputMergerとか 同じキーのものはあとから来たもので上書きするなど 少し構造が違っても,いい感じに足してくれる ArrayCreatingInputManagerとか言っていい感じにArrayに足してくれるやつもある ## Unique Work Chainに対して名前をつけ,常に同盟のものは一回しか動作しないようにする これはChainに対して名前を付けるもの,Tagは一つのWorkRequestにつけるもの! ## キャンセル キャンセルもできるぞ! ## 再起動しても動く アプリ再起動しても途中から動いてくれる→ただし,Tagの名前とかは統一しておかないと死ぬ 中華系だと再起動しない端末もあったりする(しぼう) 10分を超えると止まってしまう,レスポンスも帰ってこない