Az RxJava kiegészítők kombinálása

1. Áttekintés

Ebben az oktatóanyagban az RxJava's-szal fogunk játszani Teljes típus, amely tényleges érték nélküli számítási eredményt képvisel.

2. RxJava-függőség

Vegyük fel az RxJava 2 függőséget a Maven projektünkbe:

 io.reactivex.rxjava2 rxjava 2.2.2 

A legújabb verziót általában a Maven Central oldalon találjuk.

3. Teljes típus

Teljes hasonló Megfigyelhető azzal az egyetlen kivétellel, hogy az előbbi befejezési vagy hibajelzéseket ad ki, de elemeket nem. A Teljes osztály számos kényelmi módszert tartalmaz a különböző reaktív forrásokból történő létrehozására vagy megszerzésére.

Olyan példányt hozhatunk létre, amely használatával azonnal befejeződik Completable.complete ().

Ezután a használatával megfigyelhetjük állapotát DisposableCompletableObserver:

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

Ezen felül elkészíthetjük a Teljes például Hívható, cselekvő és futható:

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

Azt is megkaphatjuk Teljes bármely más típusú példányok Completable.from () vagy hív ignoreElement () a talán, az Egyetlen, a Folyékony és a Megfigyelhető forrásokon:

Flowable flowable = Folyékony .just ("kérés érkezett", "felhasználó bejelentkezett"); Completable flowableCompletable = Teljesíthető .fromPublisher (folyékony); Completable singleCompletable = Single.just (1) .ignoreElement ();

4. Láncolás Teljes

Alkalmazhatjuk a láncolást Teljes sok valós esetben, amikor csak a működés sikere érdekel:

  • Minden vagy semmi művelet, például PUT kérés végrehajtása egy távoli objektum frissítéséhez, amelyet a siker után egy helyi adatbázis frissítése követ
  • Post-factum naplózás és naplózás
  • Több akció hangszerelése, pl. elemzési feladat futtatása a beviteli művelet befejezése után

A példákat egyszerűnek és problémamegoldónak tartjuk. Fontolja meg, hogy többünk van Teljes példányok:

Először teljes = Teljes .FromSingle (Single.just (1)); Completable second = Teljesíthető .fromRunnable (() -> {}); Dobható dobható = új RuntimeException (); Teljes hiba: Single.error (dobható) .ignoreElement ();

Kombinálni kettőt Teljes egyetlen egységbe használhatjuk a és akkor() operátor:

első .ésMajd (második) .teszt () .assertComplete ();

Annyit láncolhatunk Teljes szükség szerint. Ugyanabban az időben, ha a források közül legalább az egyiket nem sikerül kitölteni, akkor az Teljes nem fog lőni onComplete () is:

első .ésThen (második) .andThen (hiba) .test () .assertError (dobható);

Továbbá, ha az egyik forrás végtelen vagy nem éri el onComplete valamilyen oknál fogva a kapott Teljes soha nem fog lőni onComplete () sem az onError () is.

Jó dolog, hogy még tesztelhetjük ezt a forgatókönyvet:

... .ésThen (Befejezhető.soha ()) .test () .assertNotComplete ();

5. A kiegészítők sorozatának összeállítása

Képzelje el, hogy van egy rakás Teljes. Gyakorlati felhasználásként tegyük fel, hogy regisztrálnunk kell egy felhasználót több külön alrendszeren belül.

Csatlakozni az összeshez Teljes egyetlen egységbe használhatjuk a összeolvad() módszercsalád. A összeolvad() üzemeltető engedélyezi az összes forrás előfizetését.

Az eredményül kapott példány az összes forrás elkészültével befejeződik. Ezenkívül a -vel végződik onError ha bármely forrás hibát bocsát ki:

Completable.mergeArray (első, második) .test () .assertComplete (); Completable.mergeArray (első, második, hiba) .test () .assertError (dobható);

Térjünk át egy kissé eltérő használati esetre. Tegyük fel, hogy végre kell hajtanunk egy műveletet az a-ból nyert minden elemre Folyékony.

Aztán szeretnénk egy kislemezt Teljes mind az upstream, mind az összes elemszintű művelet befejezéséhez. A flatMapCompletable() operátor segít ebben az esetben:

Completable allElementsCompletable = Folyékony .just ("kérés érkezett", "felhasználó bejelentkezett") .flatMapCompletable (üzenet -> Teljesíthető .fromRunnable (() -> System.out.println (üzenet))); allElementsCompletable .test () .assertComplete ();

Hasonlóképpen, a fenti módszer elérhető a többi reaktív báziskategóriához, mint például Megfigyelhető, Talán, vagy Egyetlen.

Gyakorlati kontextusaként flatMapCompletable (), elgondolkodhatnánk azon, hogy minden elemet valamilyen mellékhatással díszítünk. Írhatunk naplóbejegyzést befejezett elemenként, vagy tárolási pillanatképet készíthetünk minden sikeres műveletről.

Végül, szükségünk lehet a Teljes néhány más forrásból, és szüntesse meg, amint bármelyikük befejezi. Ahol amb az üzemeltetők segíthetnek.

A amb az előtag rövid kéz a „kétértelmű” kifejezésre, ami a bizonytalanságot jelenti Teljes pontosan elkészül. Például, ambArray ():

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

Ne feledje, hogy a fentiek Teljes is megszűnhet onError () ahelyett onComplete () attól függően, hogy melyik forrás fejeződik be először:

Completable.ambArray (hiba, első, második) .test () .assertError (dobható);

Továbbá, ha az első forrás megszűnik, garantálják a többi forrás ártalmatlanítását.

Ez azt jelenti, hogy minden megmaradt fut Teljes a Disposable.dispose () oldalon leállítják, és a megfelelő CompletableObservers leiratkozik.

Egy gyakorlati példát illetően használhatjuk amb () amikor egy biztonsági másolat fájlt több egyenértékű távoli tárolóba továbbítunk. És befejezzük a folyamatot, amint az első legjobb biztonsági mentés befejeződik, vagy hiba esetén megismételjük a folyamatot.

6. Következtetés

Ebben a cikkben röviden áttekintettük a Teljes típusú RxJava.

A megszerzéshez különböző lehetőségekkel kezdtük Teljes példányokat, majd láncolva és komponálva Teljes a andThen (), egyesítés (), flatMapCompletable (), és amb… () üzemeltetők.

Megtalálhatjuk az összes kódminta forrását a GitHubon.