Kombination af RxJava-kompletter

1. Oversigt

I denne vejledning spiller vi med RxJava's Kompletabel type, der repræsenterer et beregningsresultat uden en faktisk værdi.

2. RxJava-afhængighed

Lad os inkludere RxJava 2-afhængigheden i vores Maven-projekt:

 io.reactivex.rxjava2 rxjava 2.2.2 

Vi kan normalt finde den nyeste version på Maven Central.

3. Kompletabel type

Kompletabel ligner Observerbar med den eneste undtagelse, at førstnævnte udsender enten komplet eller fejlsignaler, men ingen genstande. Det Kompletabel klasse indeholder flere bekvemme metoder til at oprette eller få den fra forskellige reaktive kilder.

Vi kan gyde en instans, der fuldføres straks ved hjælp af Completable.complete ().

Derefter kan vi observere dens tilstand ved hjælp af DisposableCompletableObserver:

Kompletabel .komplet (). Abonner (ny DisposableCompletableObserver () {@Override public void onComplete () {System.out.println ("Completed!");} @ Override public void onError (Throwable e) {e.printStackTrace (); }});

Derudover kan vi konstruere en Kompletabel eksempel fra Callable, Action og Runnable:

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

Vi kan også få Kompletabel forekomster fra andre typer ved hjælp af en Completable.from () eller ringer ignorere element () om sig selv, enkeltstående, flydbare og observerbare kilder:

Flowable flowable = Flowable .just ("anmodning modtaget", "bruger logget ind"); Completable flowableCompletable = Kompletabel .fromPublisher (flydbar); Completable singleCompletable = Single.just (1) .ignoreElement ();

4. Lænkning Kompletabeller

Vi kan anvende sammenkædning af Kompletabeller i mange virkelige brugssager, når vi kun interesserer os for, at operationen lykkes:

  • Alt-eller-intet-handlinger som at lave en PUT-anmodning om at opdatere et fjernobjekt efterfulgt af en lokal databaseopdatering efter succesen
  • Post-factum logning og journalføring
  • Orkestrering af flere handlinger, f.eks. kører et analysejob, når en indtagelseshandling er afsluttet

Vi holder eksempler enkle og problem agnostiske. Overvej, at vi har flere Kompletabel tilfælde:

Completable first = Completable .fromSingle (Single.just (1)); Completable second = Completable .fromRunnable (() -> {}); Kastbar kastbar = ny RuntimeException (); Fuldstændig fejl = Single.error (kastbar) .ignoreElement ();

At kombinere to Kompletabeller i en enkelt, kan vi bruge og så() operatør:

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

Vi kan kæde så mange Kompletabeller efter behov. På samme tid, hvis mindst en af ​​kilderne ikke fuldføres, hvilket resulterer Kompletabel vil ikke skyde onComplete () såvel:

første .andThen (anden) .andThen (fejl) .test () .assertError (kastbar);

Desuden, hvis en af ​​kilderne er uendelig eller ikke når ud onComplete af en eller anden grund, det resulterende Kompletabel vil aldrig skyde onComplete () heller ikke onError () også.

En god ting, at vi stadig kan teste dette scenario:

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

5. Komponerende serie af kompletter

Forestil dig, at vi har en masse Kompletabeller. Antag i praksis, at vi har brug for at registrere en bruger inden for flere separate undersystemer.

At slutte sig til alle Kompletabeller i en enkelt, kan vi bruge fusionere() familie af metoder. Det fusionere() tillader abonnement på alle kilder.

Den resulterende forekomst udfyldes, når alle kilder er afsluttet. Derudover slutter det med onError når nogen af ​​kilderne udsender en fejl:

Completable.mergeArray (første, anden) .test () .assertComplete (); Completable.mergeArray (first, second, error) .test () .assertError (throwable);

Lad os gå videre til en lidt anden brugssag. Lad os sige, at vi er nødt til at udføre en handling for hvert element opnået fra a Flydbar.

Så vil vi have en single Kompletabel til både færdiggørelse af opstrøms og alle element-niveau-handlinger. Det flatMapCompletable() operatør kommer til at hjælpe i dette tilfælde:

Completable allElementsCompletable = Flydbar .just ("anmodning modtaget", "bruger logget ind") .flatMapCompletable (meddelelse -> Kompletabel. FraRunnable (() -> System.out.println (meddelelse))); allElementsCompletable .test () .assertComplete ();

Tilsvarende er ovenstående fremgangsmåde tilgængelig for resten af ​​basereaktive klasser som Observerbar, måske, eller Enkelt.

Som en praktisk sammenhæng for flatMapCompletable (), kunne vi tænke på at dekorere hver genstand med en eller anden bivirkning. Vi kan skrive en logpost pr. Færdiggjort element eller lave et lager-øjebliksbillede af hver vellykkede handling.

Langt om længe, vi skal muligvis konstruere en Kompletabel fra et par andre kilder, og få det afsluttet, så snart en af ​​dem er færdig. Det er her amb operatører kan hjælpe.

Det amb præfikset er en kort hånd for "tvetydig", hvilket antyder usikkerheden omkring Kompletabel nøjagtigt bliver afsluttet. For eksempel, ambArray ():

Completable.ambArray (first, Completable.never (), second) .test () .assertComplete ();

Bemærk, at ovenstående Kompletabel kan også ende med onError () i stedet for onComplete () afhængigt af hvilken kilde, der kan fuldføres, afsluttes først:

Completable.ambArray (fejl, første, anden) .test () .assertError (kastbar);

Når først den første kilde ophører, garanteres de resterende kilder også at blive bortskaffet.

Det betyder, at alle resterende kører Kompletabeller stoppes via Disposable.dispose (), og tilsvarende CompletableObservers afmeldes.

Med hensyn til et praktisk eksempel kan vi bruge amb () når vi streamer en sikkerhedskopifil til flere ekvivalente fjernlagre. Og vi afslutter processen, når den første bedste sikkerhedskopi er færdig, eller gentager processen efter fejl.

6. Konklusion

I denne artikel gennemgik vi kort Kompletabel type RxJava.

Vi startede med forskellige muligheder for at få Kompletabel forekomster og derefter lænket og komponeret Kompletabeller ved hjælp af andThen (), merge (), flatMapCompletable (), og amb ... () operatører.

Vi kan finde kilden til alle kodeeksempler på GitHub.


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