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.

Quindi, invece di estendere Worker, dovresti estendere RxWorker. Infine, sostituisci il metodo RxWorker.createWork() per restituire un valore Single<Result> che indica la Result dell'esecuzione, come indicato di seguito:

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() viene chiamato nel thread principale, ma il valore restituito è subscribed su un thread in background per impostazione predefinita. Puoi eseguire l'override di RxWorker.getBackgroundScheduler() per modificare il thread di sottoscrizione.

Quando un valore di RxWorker è onStopped(), l'abbonamento verrà eliminato, quindi non dovrai gestire in alcun modo le interruzioni del lavoro.