RxWorker でのスレッド化

WorkManager と RxJava は相互運用が可能です。まず、gradle ファイルに work-runtime に加えて work-rxjava3 の依存関係を追加します。代わりに rxjava2 をサポートする work-rxjava2 の依存関係もあります。

次に、Worker ではなく RxWorker を拡張します。最後に、次のように RxWorker.createWork() メソッドをオーバーライドして、実行の Result を示す Single<Result> を返します。

Kotlin

class RxDownloadWorker(
        context: Context,
        params: WorkerParameters
) : RxWorker(context, params) {
    override fun createWork(): Single<Result> {
        return Observable.range(0, 100)
                .flatMap { download("https://www.example.com") }
                .toList()
                .map { Result.success() }
    }
}

Java

public class RxDownloadWorker extends RxWorker {

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

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

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

RxWorkeronStopped() の場合、登録は破棄されるため、特別な方法で処理の停止に対処する必要はありません。