Kombinerer RxJava Completables

1. Oversikt

I denne opplæringen spiller vi med RxJava Fullførbar type, som representerer et beregningsresultat uten en faktisk verdi.

2. RxJava-avhengighet

La oss inkludere RxJava 2-avhengigheten i vårt Maven-prosjekt:

 io.reactivex.rxjava2 rxjava 2.2.2 

Vi finner vanligvis den nyeste versjonen på Maven Central.

3. Fullførbar type

Fullførbar den er lik Observerbar med det eneste unntaket at førstnevnte avgir enten fullføring eller feilsignaler, men ingen gjenstander. De Fullførbar klassen inneholder flere praktiske metoder for å lage eller få tak i den fra forskjellige reaktive kilder.

Vi kan gyte en forekomst som fullføres umiddelbart ved hjelp av Completable.complete ().

Deretter kan vi observere tilstanden ved å bruke DisposableCompletableObserver:

Completable .complete () .subscribe (new DisposableCompletableObserver () {@Override public void onComplete () {System.out.println ("Completed!");} @ Override public void onError (Throwable e) {e.printStackTrace (); }});

I tillegg kan vi konstruere en Fullførbar instans fra Callable, Action og Runnable:

Completable.fromRunnable (() -> {});

Vi kan også få Fullførbar forekomster fra andre typer som bruker en av dem Completable.from () eller ringer ignorere element () på kanskje, enkle, flytbare og observerbare kilder selv:

Flytbar flytbar = Flytbar .just ("forespørsel mottatt", "bruker logget på"); Completable flowableCompletable = Fullførbar .fromPublisher (flytbar); Completable singleCompletable = Single.just (1) .ignoreElement ();

4. Kjetting Kompletterbare

Vi kan benytte lenking av Kompletterbare i mange brukstilfeller fra den virkelige verden når vi bare bryr oss om suksessen med driften:

  • Alt-eller-ingenting-handlinger som å gjøre en PUT-forespørsel om å oppdatere et eksternt objekt etterfulgt av en lokal databaseoppdatering etter suksess
  • Post-factum logging og journalføring
  • Orkestrering av flere handlinger, f.eks. kjører en analysejobb etter at en inntakshandling er fullført

Vi holder eksemplene enkle og problemagnostiske. Tenk at vi har flere Fullførbar forekomster:

Fullførbar først = Fullførbar .fromSingle (Single.just (1)); Completable second = Completable .fromRunnable (() -> {}); Kastbar kastbar = ny RuntimeException (); Komplettbar feil = Single.error (kastbar) .ignoreElement ();

Å kombinere to Kompletterbare til en enkelt, kan vi bruke og så() operatør:

første .andThen (andre) .test () .assertComplete ();

Vi kan kjede så mange Kompletterbare etter behov. Samtidig, hvis minst en av kildene ikke fullføres, noe som resulterer Fullførbar vil ikke skyte onComplete () også:

første .andThen (andre) .andThen (feil) .test () .assertError (kastbar);

Dessuten, hvis en av kildene er uendelig eller ikke når onComplete av en eller annen grunn, det resulterende Fullførbar vil aldri skyte onComplete () heller ikke onError () også.

En god ting at vi fortsatt kan teste dette scenariet:

.... og deretter (Completable.never ()) .test () .assertNotComplete ();

5. Komponerende serie kompletterer

Tenk deg at vi har en haug med Kompletterbare. Når det gjelder praktisk bruk, antar at vi trenger å registrere en bruker i flere separate delsystemer.

Å bli med alle Kompletterbare i en enkelt, kan vi bruke slå sammen() familie av metoder. De slå sammen() tillater abonnement på alle kilder.

Den resulterende forekomsten fullføres når alle kildene er fullført. I tillegg slutter den med onError når noen av kildene avgir en feil:

Completable.mergeArray (første, andre) .test () .assertComplete (); Completable.mergeArray (første, andre, feil) .test () .assertError (kastbar);

La oss gå videre til en litt annen brukstilfelle. La oss si at vi må utføre en handling for hvert element hentet fra a Flytbar.

Så vil vi ha en singel Fullførbar for både fullføring av oppstrøms og alle elementnivåhandlinger. De flatMapCompletable() operatør kommer til å hjelpe i dette tilfellet:

Completable allElementsCompletable = Flytbar .just ("forespørsel mottatt", "bruker logget på") .flatMapCompletable (melding -> Komplettbar. FraRunnable (() -> System.out.println (melding))); allElementsCompletable .test () .assertComplete ();

Tilsvarende er fremgangsmåten ovenfor tilgjengelig for resten av basereaktive klasser som Observerbar, Kan være, eller Enkelt.

Som en praktisk sammenheng for flatMapCompletable (), kunne vi tenke på å dekorere hvert element med noen bivirkninger. Vi kan skrive en loggoppføring per fullført element eller lage et lagringsbilde av hver vellykkede handling.

Endelig, vi kan trenge å konstruere en Fullførbar fra et par andre kilder og få den avsluttet så snart en av dem er ferdig. Det er hvor amb operatører kan hjelpe.

De amb prefikset er en kort hånd for "tvetydig", noe som antyder usikkerheten om hvilken Fullførbar blir nøyaktig fullført. For eksempel, ambArray ():

Completable.ambArray (først, Completable.never (), andre) .test () .assertComplete ();

Merk at ovennevnte Fullførbar kan også avsluttes med onError () i stedet for onComplete () avhengig av hvilken kilde som kan fullføres, avsluttes først:

Completable.ambArray (feil, første, andre) .test () .assertError (kastbar);

Når den første kilden avsluttes, garanteres de gjenværende kildene også.

Det betyr at alle gjenværende kjører Kompletterbare stoppes via Disposable.dispose () og tilsvarende CompletableObservers vil bli abonnert.

Når det gjelder et praktisk eksempel, kan vi bruke amb () når vi streamer en sikkerhetskopifil til flere ekvivalente fjernlagre. Og vi fullfører prosessen når den første beste sikkerhetskopien er ferdig, eller gjentar prosessen ved feil.

6. Konklusjon

I denne artikkelen gjennomgikk vi kort Fullførbar type RxJava.

Vi startet med forskjellige muligheter for å skaffe Fullførbar forekomster og deretter lenket og komponert Kompletterbare ved å bruke andThen (), merge (), flatMapCompletable (), og amb ... () operatører.

Vi kan finne kilden for alle kodeeksempler på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found