Cómo ejecutar subprocesos en RxWorker

Proporcionamos interoperabilidad entre WorkManager y RxJava. Para comenzar, incluye la dependencia work-rxjava3, además de work-runtime en tu archivo de Gradle. También hay una dependencia work-rxjava2 que, en su lugar, admite rxjava2.

Luego, en lugar de extender Worker, deberías extender RxWorker. Finalmente, anula el método RxWorker.createWork() para que se muestre un Single<Result> que indique el Result de la ejecución, como se indica a continuación:

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

Ten en cuenta que se llama a RxWorker.createWork() en el subproceso principal, pero el valor que se muestre estará suscrito en un subproceso en segundo plano de forma predeterminada. Puedes anular RxWorker.getBackgroundScheduler() para cambiar el subproceso de suscripción.

Cuando un RxWorker muestra onStopped(), se eliminará la suscripción, por lo que no es necesario que controles las interrupciones de trabajo de ninguna manera especial.