We provide interoperability between WorkManager and RxJava. To get started, include work-rxjava3
dependency in addition to work-runtime
in your gradle file. There is also a work-rxjava2
dependency that supports rxjava2 instead.
Then, instead of extending Worker
, you should extend RxWorker
. Finally override the RxWorker.createWork()
method to return a Single<Result>
indicating the Result
of your execution, as follows:
Котлин
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() } } }
Ява
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() }; } }
Note that RxWorker.createWork()
is called on the main thread, but the return value is subscribed on a background thread by default. You can override RxWorker.getBackgroundScheduler()
to change the subscribing thread.
When an RxWorker
is onStopped()
, the subscription will get disposed of, so you don't need to handle work stoppages in any special way.