10. kapusta, stofanak - eglu

32
Džava reaktívne programovanie Mário Kapusta & Martin Štofaňák

Upload: mobcon

Post on 18-Aug-2015

14 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: 10. Kapusta, Stofanak - eGlu

Džava reaktívne programovanieMário Kapusta & Martin Štofaňák

Page 2: 10. Kapusta, Stofanak - eGlu

Dnes si povieme

1. Čo to je?

2. Prečo to je super?

3. Ako to použiť?

Page 3: 10. Kapusta, Stofanak - eGlu

1. Asynchrónne prúdy dát

2. Prúd(stream) môže byť čokoľvek

3. RxJava ponúka magnifikálne možnosti

Čo to je?

Page 4: 10. Kapusta, Stofanak - eGlu
Page 5: 10. Kapusta, Stofanak - eGlu

Silné diagramyASYNC

SYNC

WOW

VERY SHINY

SUCH DIAGRAM

Page 6: 10. Kapusta, Stofanak - eGlu
Page 7: 10. Kapusta, Stofanak - eGlu

Na návrhu záleží

Page 8: 10. Kapusta, Stofanak - eGlu

Už viete, čo to je a že je to super

Page 9: 10. Kapusta, Stofanak - eGlu

Naprogramujeme SERVER

Page 10: 10. Kapusta, Stofanak - eGlu

Observable.zip(MAGIC STUFF)- Len jedna z mnohých

- Spájanie streamov

Page 11: 10. Kapusta, Stofanak - eGlu

Začneme requestom@ResponseBody @RequestMapping(method = RequestMethod.GET, value = "/dashboard") public DeferredResult<DashboardDto> getDefaultDashBoard( HttpServletRequest request, HttpServletResponse response){

final String accessToken = getAccessToken(request); final DeferredResult<DashboardDto> deffered = new DeferredResult<>(90000);

someService.dashBoard(accessToken, deffered);

return deffered;

}

Page 12: 10. Kapusta, Stofanak - eGlu

User authorization(String token);

List<EmmaWatson> getAllNakedPhotos();

ChuckNorris getRandomChuckNorris();

Takto by vypadali metody normálne

Page 13: 10. Kapusta, Stofanak - eGlu

Prerobíme metódy na ObservableObservable<ChuckNorris> getRandomChuckNorris(){ return Observable.create(Subscriber -> { chuck.onNext(new ChuckNorris()); chuck.onCompleted(); })

.subscribeOn(Schedulers.io()); }

Page 14: 10. Kapusta, Stofanak - eGlu

Observable<User> authorization(String token);

Observable<List<EmmaWatson>> getAllNakedPhotos();

Observable<ChuckNorris> getRandomChuckNorris();

Toto bude výsledok

Page 15: 10. Kapusta, Stofanak - eGlu

public Dashboard dashBoard(String token, DeferredResult<Dashboard> def){

Func2 function = (Func2<User, List<EmmaWatson>, ChuckNorris, MyDataContainer>) (user, photos, chuck) -> new Dashboard(user, photos, chuck);

Observable.zip( authorization(token), getAllNakedPhotos(), getRandomChuckNorris(), function) .subscribe(

(dashboardDto) -> def.setResult(dashboardDto), (error) -> def.setErrorResult(error)

); }

Tri streamy chceme spojiť do jedného

Page 16: 10. Kapusta, Stofanak - eGlu

To bolo všetkoVďaka RX Jave bol request 2.3x rýchlejší!!!

1 166ms vs.

72ms

Page 17: 10. Kapusta, Stofanak - eGlu
Page 18: 10. Kapusta, Stofanak - eGlu

Android

Page 19: 10. Kapusta, Stofanak - eGlu

RxAndroid- ReactiveX / RxAndroid

- minSdkVersion 10

Page 20: 10. Kapusta, Stofanak - eGlu

Prečo RxAndroid ?- Api volania

- Reťazenie requestov

- Minimalizovanie “boilerplate” kódu

- Dôraz na logiku pred implemetáciou

- Modularizácia

Page 21: 10. Kapusta, Stofanak - eGlu
Page 22: 10. Kapusta, Stofanak - eGlu

Architektúra

Aktuálna pozícia zariadenia

Počasie pre získanú pozíciu

UI

Dáta

Page 23: 10. Kapusta, Stofanak - eGlu

Architektúra

Google API client

getLocation { Location }

API GetWeatherForLocation

{ Weather }

UI

Geocoder {List<Address>}

Page 24: 10. Kapusta, Stofanak - eGlu

Architektúra

Google API client

getLocation { Location }

Geocoder {List<Address>}

API GetWeatherForLocation

{ Weather }

Address provider { Address }

Weather provider{ WeatherResult }

UI

Page 25: 10. Kapusta, Stofanak - eGlu

AddressProvider { Address }Observable<Address> addressObservable = Observable

.create(googleApiObservable)

.flatMap((Func1) (googleApiClient) -> { return LocationObservable.createObservable(googleApiClient);

}) .flatMap((Func1) (location) -> {

return GeocoderObservable.createObservable(context, location.getLatitude(), location.getLongitude(), ADDRESS_MAX_RESULTS);

}) .map((Func1) (addresses) -> {

return addresses.get(0); });

return addressObservable;

Page 26: 10. Kapusta, Stofanak - eGlu

GoogleApiObservable { GoogleApiClient }@Override public void call(Subscriber<? super GoogleApiClient> subscriber) {

client = buildApiClient(subscriber); if(client == null)

subscriber.onError(new GoogleApiException("Error while creating api client")); try {

client.connect(); } catch (Throwable ex) {

subscriber.onError(ex); }

}

@Override public void onConnected(Bundle bundle) {

observer.onNext(client); }

Page 27: 10. Kapusta, Stofanak - eGlu

LocationObservable { Location }@Override public void call(Subscriber<? super Location> subscriber) { final Location location

= LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

if(location == null) subscriber.onError(new LocationFetchFailedException());

subscriber.onNext(location); }

Page 28: 10. Kapusta, Stofanak - eGlu

GeocoderObservable { List<Address> }@Override public void call(Subscriber<? super List<Address>> subscriber) {

Geocoder geocoder = new Geocoder(ctx); try { List<Address> addresses = geocoder.getFromLocation(lat, long, maxResults);

subscriber.onNext(addresses); } catch (IOException e) {

subscriber.onError(e); }

}

Page 29: 10. Kapusta, Stofanak - eGlu

weatherObservable = addressProvider

.loadAddress()

.flatMap(address -> { addressString = String.format("%s,%s", address.city(), address.countryCode()); return weatherService.getTodayWeather(addressString, ”metric”);

}) .map(weatherResponse -> new WeatherResult(addressString, weatherResponse));

return weatherObservable;

WeatherProvider { WeatherResult }

Page 30: 10. Kapusta, Stofanak - eGlu

public interface WeatherService { @GET("/weather") Observable<WeatherResponse> getTodayWeather(@Query("q") String location,

@Query("units") String units); }

WeatherAPI { WeatherResponse }

Page 31: 10. Kapusta, Stofanak - eGlu

weatherProvider.loadWeather().subscribe(new Observer<WeatherResult>() {

@Override public void onCompleted() {}

@Override public void onError(Throwable e) { //Napr. zobrazime uzivatelovi error message

}

@Override public void onNext(WeatherResult weatherResult) { //Vyplnime UI datami o pocasi

renderView(weatherResult); }

});

UI

Page 32: 10. Kapusta, Stofanak - eGlu

https://github.com/majusko/RX-Java-REST-Server https://github.com/stofo89/SimpleRxApp.git

Ďakujeme za pozornosť