Kombinácia doplnkov RxJava

1. Prehľad

V tomto tutoriáli si zahráme s RxJava Dokončiteľné typ, ktorý predstavuje výsledok výpočtu bez skutočnej hodnoty.

2. Závislosť RxJava

Zahrňme závislosť RxJava 2 do nášho projektu Maven:

 io.reactivex.rxjava2 rxjava 2.2.2 

Najnovšiu verziu zvyčajne nájdeme na serveri Maven Central.

3. Dokončiteľný typ

Dokončiteľné je podobný Pozorovateľné s jedinou výnimkou, že prvý vydáva buď signály o dokončení, alebo o chybe, ale žiadne položky. The Dokončiteľné trieda obsahuje niekoľko pohodlných metód na ich vytvorenie alebo získanie z rôznych reaktívnych zdrojov.

Instanciu, ktorá sa dokončí okamžite, môžeme vytvoriť pomocou Completable.complete ().

Potom môžeme jeho stav pozorovať pomocou DisposableCompletableObserver:

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

Ďalej môžeme zostrojiť a Dokončiteľné príklad z Vyvolávateľné, akčné a spustiteľné:

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

Tiež môžeme získať Dokončiteľné inštancie z iných typov, ktoré používajú buď Completable.from () alebo telefonovanie ignoreElement () na samotných zdrojoch Možno, Samostatné, Plynulé a Pozorovateľné:

Flowable flowable = Flowable .just ("požiadavka prijatá", "používateľ prihlásený"); Completable flowableCompletable = Dokončiteľné .fromPublisher (splniteľné); Completable singleCompletable = Single.just (1) .ignoreElement ();

4. Reťazenie Dokončiteľné položky

Môžeme použiť reťazenie Dokončiteľné položky v mnohých prípadoch použitia v reálnom svete, keď nám záleží iba na úspechu operácie:

  • Akcie typu Všetko alebo nič, ako napríklad vykonanie požiadavky PUT na aktualizáciu vzdialeného objektu, po ktorom nasleduje aktualizácia lokálnej databázy
  • Post-factum ťažba a denník
  • Zorganizovanie viacerých akcií, napr. spustenie analytickej úlohy po dokončení akcie príjmu

Príklady ponecháme jednoduché a problémovo-agnostické. Zvážte, že ich máme niekoľko Dokončiteľné prípady:

Completable first = Completable .fromSingle (Single.just (1)); Dokončiteľná sekunda = Dokončiteľné .fromRunnable (() -> {}); Hádzateľná hádzateľná = nový RuntimeException (); Dokončiteľná chyba = Single.error (throwable) .ignoreElement ();

Kombinovať dva Dokončiteľné položky do jedného, ​​môžeme použiť a potom() operátor:

prvý .a potom (druhý) .test () .assertComplete ();

Môžeme ich reťaziť toľko Dokončiteľné položky podľa potreby. Zároveň, ak sa nepodarí dokončiť aspoň jeden zo zdrojov, výsledkom je Dokončiteľné nebude strieľať onComplete () tiež:

prvý .andThen (druhý) .andThen (chyba) .test () .assertError (hoditeľný);

Ďalej ak je jeden zo zdrojov nekonečný alebo nedosahuje onComplete z nejakého dôvodu výsledný Dokončiteľné nikdy nevystrelí onComplete () ani tiež onError ().

Dobrá vec, že ​​tento scenár môžeme ešte vyskúšať:

... .a potom (Completable.never ()) .test () .assertNotComplete ();

5. Skladanie sérií doplnkov

Predstavte si, že máme kopu Dokončiteľné položky. Ako praktický prípad použitia predpokladajme, že je potrebné zaregistrovať používateľa v niekoľkých samostatných podsystémoch.

Pripojiť sa ku všetkým Dokončiteľné položky do jedného, ​​môžeme použiť zlúčiť() skupina metód. The zlúčiť() operátor umožňuje prihlásiť sa na odber všetkých zdrojov.

Výsledná inštancia sa dokončí po dokončení všetkých zdrojov. Ďalej končí onError keď niektorý zo zdrojov vydá chybu:

Completable.mergeArray (prvý, druhý). Test () .assertComplete (); Completable.mergeArray (prvý, druhý, chyba) .test () .assertError (hoditeľný);

Prejdime k trochu inému prípadu použitia. Povedzme, že musíme vykonať akciu pre každý prvok získaný z a Tekutý.

Potom chceme singel Dokončiteľné na dokončenie dodávateľského reťazca aj všetkých akcií na úrovni elementov. The flatMapCompletable() Operátor príde pomôcť v tomto prípade:

Completable allElementsCompletable = Flowable .just ("požiadavka prijatá", "užívateľ prihlásený") .flatMapCompletable (správa -> Completable .fromRunnable (() -> System.out.println (správa))); allElementsCompletable .test () .assertComplete ();

Podobne je vyššie uvedená metóda k dispozícii pre zvyšok základných reaktívnych tried, ako je Pozorovateľné, Možnoalebo Slobodný.

Ako praktický kontext pre flatMapCompletable (), mohli by sme uvažovať o dozdobení každej položky nejakým vedľajším efektom. Môžeme napísať záznam do protokolu na každý dokončený prvok alebo vytvoriť snímku úložiska po každej úspešnej akcii.

Nakoniec možno budeme musieť skonštruovať a Dokončiteľné z niekoľkých ďalších zdrojov a okamžite po dokončení jedného z nich ho ukončite. To je kde amb operátori môžu pomôcť.

The amb predpona je skratka pre „nejednoznačný“, z čoho vyplýva neistota Dokončiteľné presne sa dokončí. Napríklad, ambArray ():

Completable.ambArray (prvý, Completable.never (), druhý). Test () .assertComplete ();

Upozorňujeme, že vyššie uvedené Dokončiteľné môžu tiež končiť s onError () namiesto onComplete () podľa toho, ktorý zdroj je dokončiteľný ako prvý, končí:

Completable.ambArray (chyba, prvá, druhá). Test () .assertError (vyhadzovateľná);

Akonáhle dôjde k ukončeniu prvého zdroja, je zaručené, že zostávajúce zdroje budú zlikvidované.

To znamená, že všetky zostávajú v prevádzke Dokončiteľné položky sú zastavené cez Disposable.dispose () a príslušné CompletableObservers budú zrušené.

Pokiaľ ide o praktický príklad, môžeme použiť amb () keď streamujeme záložný súbor do niekoľkých ekvivalentov vzdialených úložísk. A dokončíme proces, akonáhle dokončíte prvé najlepšie zálohovanie, alebo proces zopakujte pri chybe.

6. Záver

V tomto článku sme v krátkosti preskúmali Dokončiteľné typ RxJava.

Začali sme rôznymi možnosťami získania Dokončiteľné inštancie a potom pripútané a zložené Dokončiteľné položky pomocou andThen (), merge (), flatMapCompletable (), a amb… () operátorov.

Zdroj pre všetky vzorky kódu nájdeme na GitHub.


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