Kombinirajući RxJava kompletable

1. Pregled

U ovom uputstvu igrat ćemo se s RxJavinim Izvršljivo tip, koji predstavlja rezultat izračuna bez stvarne vrijednosti.

2. Ovisnost RxJava

Uključimo ovisnost RxJava 2 u naš Maven projekt:

 io.reactivex.rxjava2 rxjava 2.2.2 

Najnoviju verziju obično možemo pronaći na Maven Central.

3. Kompletibilni tip

Izvršljivo je sličan Uočljiv uz jedinu iznimku da prva emitira signale dovršetka ili pogreške, ali nema stavki. The Izvršljivo razred sadrži nekoliko praktičnih metoda za njegovo stvaranje ili dobivanje iz različitih reaktivnih izvora.

Primjerom možemo stvoriti instancu koja se odmah dovršava Completable.complete ().

Tada možemo pomoću stanja promatrati njegovo stanje DisposableCompletableObserver:

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

Uz to možemo konstruirati i Izvršljivo primjer iz Može se pozvati, aktivirati i pokrenuti:

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

Također, možemo dobiti Izvršljivo primjerci iz drugih vrsta koristeći bilo koji Dovršljivo.od () ili pozivanje ignoreElement () o samim, pojedinačnim, protočnim i uočljivim izvorima:

Tekuće teče = Tekuće .just ("zahtjev primljen", "korisnik prijavljen"); Completable flowableCompletable = Dovršljivo .fromPublisher (protočno); Dovršljivo singleCompletable = Single.just (1) .ignoreElement ();

4. Ulančavanje Izvršive

Možemo upotrijebiti ulančavanje Izvršive u mnogim slučajevima stvarne uporabe kada nam je stalo samo do uspjeha operacije:

  • Sve ili ništa, poput izvođenja zahtjeva PUT za ažuriranje udaljenog objekta, nakon čega slijedi ažuriranje lokalne baze podataka nakon uspjeha
  • Post-factum bilježenje i vođenje dnevnika
  • Orkestracija nekoliko radnji, na pr. izvođenje analitičkog posla nakon dovršetka akcije gutanja

Primjere ćemo držati jednostavnima i agnotizirati probleme. Uzmimo u obzir da ih imamo nekoliko Izvršljivo primjerci:

Prvo dovršljivo = dovršljivo .fromSingle (Single.just (1)); Dovršljivo drugo = Dovršljivo .fromRunnable (() -> {}); Mogućnost bacanja = new RuntimeException (); Ispuniva pogreška = Single.error (bacanje) .ignoreElement ();

Da se kombiniraju dva Izvršive u jedan, možemo koristiti i onda() operater:

prvo .i zatim (drugo) .test () .assertComplete ();

Možemo ih povezati u lance Izvršive po potrebi. U isto vrijeme, ako barem jedan od izvora ne uspije dovršiti, što rezultira Izvršljivo neće pucati onComplete () također:

prvo .i zatim (drugo). i tada (pogreška) .test () .assertError (bacanje);

Nadalje, ako je jedan od izvora beskonačan ili ne doseže onComplete iz nekog razloga, rezultirajuće Izvršljivo nikada neće pucati onComplete () ni onError () također.

Dobra stvar je što i dalje možemo testirati ovaj scenarij:

... .andThen (Completable.never ()) .test () .assertNotComplete ();

5. Sastavljanje niza kompletabli

Zamislite da ih imamo gomilu Izvršive. Što se tiče praktične upotrebe, pretpostavimo da moramo registrirati korisnika u nekoliko zasebnih podsustava.

Da se pridružim svima Izvršive u jedan, možemo koristiti sjediniti() obitelj metoda. The sjediniti() operater omogućuje pretplatu na sve izvore.

Rezultirajuća instanca dovršava kad se završe svi izvori. Uz to, završava s onError kada bilo koji od izvora emitira pogrešku:

Completable.mergeArray (prvi, drugi) .test () .assertComplete (); Completable.mergeArray (prva, druga, pogreška) .test () .assertError (bacanje);

Prijeđimo na malo drugačiji slučaj upotrebe. Recimo da trebamo izvršiti akciju za svaki element dobiven iz a Tekuće.

Zatim, želimo singl Izvršljivo i za dovršetak uzvodnih i za sve akcije na razini elementa. The flatMapCompletable() operator dolazi u pomoć u ovom slučaju:

Completable allElementsCompletable = Tekuće .samo ("zahtjev primljen", "korisnik prijavljen") .flatMapCompletable (poruka -> Dovršljivo .fromRunnable (() -> System.out.println (poruka))); allElementsCompletable .test () .assertComplete ();

Slično tome, gornja metoda je dostupna za ostale osnovne reaktivne klase, poput Uočljiv, Može biti, ili Singl.

Kao praktični kontekst za flatMapCompletable (), mogli bismo razmišljati o tome da svaki predmet ukrasimo nekom nuspojavom. Možemo zapisati zapisnik po dovršenom elementu ili napraviti snimku pohrane nakon svake uspješne akcije.

Konačno, možda ćemo trebati konstruirati a Izvršljivo iz nekoliko drugih izvora i prekinite ga čim oba dovrše. To je gdje amb operateri mogu pomoći.

The amb prefiks je kratica za "dvosmislen", što implicira neizvjesnost oko toga Izvršljivo točno se dovršava. Na primjer, ambArray ():

Completable.ambArray (prvi, Completable.never (), drugi) .test () .assertComplete ();

Imajte na umu, da gore navedeno Izvršljivo također može završiti sa onError () umjesto onComplete () ovisno o tome koji se izvor završava prvo završava:

Completable.ambArray (pogreška, prva, druga) .test () .assertError (bacanje);

Također, nakon prestanka rada prvog izvora, zajamčeno je zbrinjavanje preostalih izvora.

To znači da svi preostali trče Izvršive zaustavljaju se putem Disposable.dispose () i odjavit će se odgovarajući CompletableObservers.

Što se tiče praktičnog primjera, možemo se poslužiti amb () kada streamo datoteku sigurnosne kopije u nekoliko ekvivalenata na udaljene pohrane. A postupak dovršavamo kad završi prva najbolja izrada sigurnosnih kopija ili ponavljamo postupak u slučaju pogreške.

6. Zaključak

U ovom smo članku ukratko pregledali Izvršljivo vrsta RxJava.

Počeli smo s različitim mogućnostima za dobivanje Izvršljivo instance, a zatim okovane i sastavljene Izvršive pomoću andThen (), merge (), flatMapCompletable (), i amb… () operatora.

Izvor za sve uzorke koda možemo pronaći na GitHubu.


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