Az utólagos felszerelés integrálása az RxJava-val
1. Áttekintés
Ez a cikk arra összpontosít, hogyan lehet egy egyszerű RxJava-kompatibilis REST klienst megvalósítani a Retrofit használatával.
Készítünk egy példaalkalmazást, amely együttműködik a GitHub API-val - a szokásos Retrofit megközelítés használatával, majd az RxJava segítségével továbbfejlesztjük a reaktív programozás előnyeinek kiaknázására.
2. Sima utólagos felszerelés
Készítsünk először egy példát a Retrofit alkalmazással. A GitHub API-k segítségével válogatott listát kapunk az összes olyan közreműködőről, akiknek több mint 100 hozzájárulása van bármelyik tárban.
2.1. Maven-függőségek
A Retrofit alkalmazással indítsuk el ezeket a Maven-tárgyakat:
com.squareup.retrofit2 utólagos 2.3.0 com.squareup.retrofit2 átalakító-gson 2.3.0
A legújabb verziók megtekintéséhez tekintse meg a Maven Central adattárának utólagos felszerelését és a konverter-gson-t.
2.2. API interfész
Hozzunk létre egy egyszerű felületet:
nyilvános felület GitHubBasicApi {@GET ("users / {user} / repos") HíváslistaRepos (@Path ("user") String felhasználó); @GET ("repos / {user} / {repo} / közreműködők") HíváslistaRepoContributors (@Path ("user") String felhasználó, @Path ("repo") String repo); }
A listRepos () A metódus lekérdezi az adott felhasználó elérési útjának paramétereként átadott adattárak listáját.
A listRepoContributers () A metódus lekérdezi az adott felhasználó és adattár közreműködőinek listáját, mindkettő elérési útként paraméterként továbbítva.
2.3. Logika
Végezzük el a szükséges logikát a Retrofit használatával Hívás objektumok és normál Java kód:
osztály GitHubBasicService {privát GitHubBasicApi gitHubApi; GitHubBasicService () {Retrofit retrofit = new Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .build (); gitHubApi = retrofit.create (GitHubBasicApi.class); } A getTopContributors lista (String felhasználónév) dobja az IOException {List repos = gitHubApi .listRepos (felhasználónév) .execute () .body (); repos = repos! = null? repók: Collections.emptyList (); return repos.stream () .flatMap (repo -> getContributors (userName, repo)) .sorted ((a, b) -> b.getContributions () - a.getContributions ()) .map (Contributor :: getName). külön () .rendezve () .collect (Collectors.toList ()); } privát adatfolyam getContributors (String felhasználónév, Repository repo) {List közreműködők = null; próbáld ki a {közreműködők = gitHubApi .listRepoContributors (felhasználónév, repo.getName ()) .execute () .body (); } catch (IOException e) {e.printStackTrace (); } közreműködők = közreműködők! = null? közreműködők: Collections.emptyList (); visszatérő közreműködők.stream () .filter (c -> c.getContributions ()> 100); }}
3. Integráció az RxJava-val
Az utólagos felszerelés lehetővé teszi számunkra, hogy a szokásos helyett egyedi kezelőkkel fogadjuk a hívások eredményeit Hívás objektumot az Utánépítés használatával Hívás adapterek. Ez lehetővé teszi az RxJava használatát Megfigyelhetők és Folyékony itt.
3.1. Maven-függőségek
Az RxJava adapter használatához bele kell foglalnunk ezt a Maven-műtárgyat:
com.squareup.retrofit2 adapter-rxjava 2.3.0
A legújabb verzióért kérjük, ellenőrizze az adapter-rxjava alkalmazást a Maven központi adattárában.
3.2. Regisztrálja az RxJava hívásadaptert
Tegyük hozzá RxJavaCallAdapter az építtetőnek:
Retrofit retrofit = új Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .addCallAdapterFactory (RxJavaCallAdapterFactory.create ()) .build ();
3.3. API interfész
Ezen a ponton megváltoztathatjuk az interfész metódusainak visszatérési típusát Megfigyelhető inkább mint Hívás. Használhatunk más Rx típusokat is Megfigyelhető, Folyékony, Egyetlen, Talán, Teljes.
Módosítsuk az API felületünket Megfigyelhető:
nyilvános felület GitHubRxApi {@GET ("users / {user} / repos") Megfigyelhető listRepos (@Path ("user") karakterlánc felhasználó); @GET ("repos / {user} / {repo} / közreműködők") Megfigyelhető listRepoContributors (@Path ("user") String felhasználó, @Path ("repo") String repo); }
3.4. Logika
Végezzük el az RxJava használatával:
osztály GitHubRxService {privát GitHubRxApi gitHubApi; GitHubRxService () {Retrofit retrofit = new Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .addCallAdapterFactory (RxJavaCallAdapterFactory.). gitHubApi = retrofit.create (GitHubRxApi.class); } Megfigyelhető getTopContributors (Karakterlánc felhasználónév) {return gitHubApi.listRepos (felhasználónév) .flatMapIterable (x -> x) .flatMap (repo -> gitHubApi.listRepoContributors (felhasználónév, repo.getName ()) }flatMap (x) xFlatMap .filter (c -> c.getContributions ()> 100) .sorted ((a, b) -> b.getContributions () - a.getContributions ()) .térkép (Contributor :: getName) .distinct (); }}
4. Következtetés
Összehasonlítva a kódot az RxJava használata előtt és után, azt tapasztaltuk, hogy a következő módszerekkel javult:
- Reaktív - mivel adatunk most folyik az áramokban, ez lehetővé teszi számunkra, hogy aszinkron folyam feldolgozást végezzünk nem blokkoló ellennyomással
- Világos - deklaratív jellege miatt
- Tömör - az egész művelet egy műveleti láncként ábrázolható
A cikk összes kódja elérhető a GitHubon.
A csomag com.baeldung.retrofit.basic tartalmazza az alapvető utólagos felszerelési példát, míg a csomag com.baeldung.retrofit.Az rx tartalmazza az RxJava integrációval ellátott utólagos felszerelési példát.