RxWorker でのスレッド化

WorkManager と RxJava2 は相互運用が可能です。まず、gradle ファイルに work-runtime に加えて work-rxjava2 の依存関係を追加します。次に、Worker ではなく RxWorker を拡張します。最後に、次のように RxWorker.createWork() メソッドをオーバーライドして、実行の Result を示す Single<Result> を返します。

    public class RxDownloadWorker extends RxWorker {

        public RxDownloadWorker(Context context, WorkerParameters params) {
            super(context, params);
        }

        @Override
        public Single<Result> createWork() {
            return Observable.range(0, 100)
                .flatMap { download("https://www.google.com") }
                .toList()
                .map { Result.success() };
        }
    }
    

RxWorker.createWork() はメインスレッドで呼び出されていますが、戻り値はデフォルトではバックグラウンド スレッドで登録されます。登録を行うスレッドは、RxWorker.getBackgroundScheduler() をオーバーライドすることによって変更できます。

RxWorker を停止しても Observer は適切に破棄されるため、特別な方法で処理の停止に対処する必要はありません。