Exécuter des threads dans RxWorker

Nous assurons l'interopérabilité entre WorkManager et RxJava. Pour commencer, incluez la dépendance work-rxjava3 en plus de work-runtime dans votre fichier Gradle. Il existe également une dépendance work-rxjava2 compatible avec RxJava2.

Ensuite, étendez RxWorker au lieu de Worker. Enfin, remplacez la méthode RxWorker.createWork() pour renvoyer un Single<Result> indiquant le Result de votre exécution, comme suit :

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

Notez que RxWorker.createWork() est appelé sur le thread principal, mais que la valeur renvoyée est abonné à un thread en arrière-plan par défaut. Vous pouvez ignorer RxWorker.getBackgroundScheduler() pour modifier le thread d'abonnement.

Lorsqu'une valeur de RxWorker est onStopped(), l'abonnement est supprimé. Aucun traitement particulier des arrêts de tâches n'est donc nécessaire.