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()
をオーバーライドすることによって変更できます。
RxWorker
が onStopped()
の場合、登録は破棄されるため、特別な方法で処理の停止に対処する必要はありません。