Потоки в RxWorker

Мы обеспечиваем совместимость между 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() , подписка будет удалена, поэтому вам не нужно обрабатывать остановки работы каким-либо особым образом.