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.