Integriranje nadogradnje s RxJavom

1. Pregled

Ovaj se članak usredotočuje na to kako implementirati jednostavni REST-klijent spreman za RxJavu pomoću nadogradnje.

Izgradit ćemo primjer aplikacije koja komunicira s GitHub API-jem - koristeći standardni Retrofit pristup, a zatim ćemo ga poboljšati pomoću RxJave kako bismo iskoristili prednosti reaktivnog programiranja.

2. Obična nadogradnja

Napravimo prvo primjer s Retrofitom. Upotrijebit ćemo GitHub API-je za dobivanje razvrstanog popisa svih suradnika koji imaju više od 100 doprinosa u bilo kojem spremištu.

2.1. Ovisnosti Mavena

Da započnemo projekt s Retrofitom, uključimo ove Mavenove artefakte:

 com.squareup.retrofit2 retrofit 2.3.0 com.squareup.retrofit2 pretvarač-gson 2.3.0 

Za najnovije verzije, pogledajte retrofit i pretvarač-gson na spremištu Maven Central.

2.2. API sučelje

Stvorimo jednostavno sučelje:

javno sučelje GitHubBasicApi {@GET ("users / {user} / repos") Popis pozivaRepos (@Path ("user") String user); @GET ("repos / {user} / {repo} / contributors") Popis pozivaRepoContributors (@Path ("user") Korisnik niza, @Path ("repo") String repo); }

The listRepos () metoda dohvaća popis spremišta za datog korisnika prosljeđenog kao parametar puta.

The listRepoContributers () metoda dohvaća popis suradnika za datog korisnika i spremište, oba prosljeđena kao parametri puta.

2.3. Logika

Primijenimo potrebnu logiku pomoću nadogradnje Poziv objekti i normalni Java kôd:

klasa GitHubBasicService {private GitHubBasicApi gitHubApi; GitHubBasicService () {Retrofit retrofit = new Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .build (); gitHubApi = retrofit.create (GitHubBasicApi.class); } Popis getTopContributors (niz userName) baca IOException {List repos = gitHubApi .listRepos (userName) .execute () .body (); repos = repos! = null? repo poslovi: Collections.emptyList (); vratite repos.stream () .flatMap (repo -> getContributors (korisničko ime, repo)). sortirano ((a, b) -> b.getContributions () - a.getContributions ()) .map (Contributor :: getName). distinct () .sorted () .collect (Collectors.toList ()); } private Stream getContributors (String userName, repozitorij repo) {List contributors = null; isprobajte {contributors = gitHubApi .listRepoContributors (userName, repo.getName ()) .execute () .body (); } catch (IOException e) {e.printStackTrace (); } suradnici = suradnici! = null? suradnici: Collections.emptyList (); vratiti doprinosnike.stream () .filter (c -> c.getContributions ()> 100); }}

3. Integriranje s RxJavom

Retrofit omogućuje nam primanje rezultata poziva s prilagođenim rukovateljima umjesto uobičajenim Poziv objekt pomoću nadogradnje Poziv adapteri. To omogućuje upotrebu RxJave Vidljive i Cvjetnice ovdje.

3.1. Ovisnosti Mavena

Da bismo koristili RxJava adapter, moramo uključiti ovaj Mavenov artefakt:

 com.squareup.retrofit2 adapter-rxjava 2.3.0 

Za najnoviju verziju provjerite adapter-rxjava u središnjem spremištu Maven.

3.2. Registrirajte RxJava adapter za pozive

Dodajmo RxJavaCallAdapter graditelju:

Retrofit retrofit = new Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .addCallAdapterFactory (RxJavaCallAdapterFactory.create ()) build ();

3.3. API sučelje

U ovom trenutku možemo promijeniti vrstu povratnih metoda sučelja koje ćemo koristiti Uočljiv rađe nego Poziv. Možemo koristiti druge vrste Rx poput Uočljiv, Tekuće, Singl, Može biti, Izvršljivo.

Izmijenimo naše API sučelje za upotrebu Uočljiv:

javno sučelje GitHubRxApi {@GET ("users / {user} / repos") Promatrano listRepos (@Path ("user") Korisnik niza); @GET ("repos / {user} / {repo} / contributors") Vidljivo listRepoContributors (@Path ("user") String user, @Path ("repo") String repo); }

3.4. Logika

Primijenimo ga pomoću RxJave:

klasa GitHubRxService {private GitHubRxApi gitHubApi; GitHubRxService () {Retrofit retrofit = new Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .addCallAdapterFactory (RxJavaCallAdapterFactory (RxJavaCallAdapterFactory)). gitHubApi = retrofit.create (GitHubRxApi.class); } Primjetljivi getTopContributors (niz userName) {return gitHubApi.listRepos (userName) .flatMapIterable (x -> x) .flatMap (repo -> gitHubApi.listRepoContributors (userName, repo.getName ())) (xlatMapIterable) .filter (c -> c.getContributions ()> 100). sortirano ((a, b) -> b.getContributions () - a.getContributions ()) .map (Contributor :: getName) .distinct (); }}

4. Zaključak

Usporedbom koda prije i nakon korištenja RxJave, otkrili smo da je poboljšan na sljedeće načine:

  • Reaktivan - budući da naši podaci sada teku u strujama, omogućuje nam obradu asinkrone struje s neblokirajućim protutlakom
  • Jasno - zbog svoje deklarativne prirode
  • Sažeto - cijela operacija može se predstaviti kao jedan operativni lanac

Sav kôd u ovom članku dostupan je na GitHubu.

Paket com.baeldung.retrofit.basic sadrži osnovni primjer ugradnje dok paket com.baeldung.retrofit.rx sadrži primjer ugradnje s integracijom RxJava.