Мы обеспечиваем совместимость между WorkManager и RxJava. Для начала включите зависимость work-rxjava3
в дополнение к work-runtime
в свой файл gradle. Существует также зависимость work-rxjava2
которая вместо этого поддерживает rxjava2.
Тогда вместо расширения Worker
вам следует расширить RxWorker
. Наконец, переопределите метод RxWorker.createWork()
, чтобы он возвращал Single<Result>
, указывающий Result
вашего выполнения, следующим образом:
Котлин
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() }; } }
Обратите внимание, что RxWorker.createWork()
вызывается в основном потоке, но возвращаемое значение по умолчанию подписывается на фоновый поток. Вы можете переопределить RxWorker.getBackgroundScheduler()
чтобы изменить поток подписки.
Когда RxWorker
находится onStopped()
, подписка будет удалена, поэтому вам не нужно обрабатывать остановки работы каким-либо особым образом.