Threading in RxWorker

Forniamo l'interoperabilità tra WorkManager e RxJava. Per iniziare, Includi la dipendenza work-rxjava3 oltre a work-runtime nel file Gradle. Esiste anche una dipendenza work-rxjava2 che supporta rxjava2.

Poi, invece di estendere Worker, devi estendere RxWorker. Infine sostituisci RxWorker.createWork() per restituire un valore Single<Result> che indica Result dell'esecuzione, come che segue:

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() };
    }
}

Tieni presente che RxWorker.createWork() è chiamato nel thread principale, ma viene restituito è subscribed in un thread in background per impostazione predefinita. Puoi eseguire l'override di RxWorker.getBackgroundScheduler() per modificare l'iscrizione al thread.

Quando RxWorker avrà onStopped(), l'abbonamento verrà eliminato, quindi non dovrai gestire le interruzioni di lavoro in nessun modo particolare.