Slide 1

Slide 1 text

Devfest 2017 #DevfestCochabamba17 #quierosticker

Slide 2

Slide 2 text

Programacion imperativa var a = 4 var b = 5 var c = a + b // el valor de ”c” es 9 var a = 10 // el valor de ”c” sigue siendo 9

Slide 3

Slide 3 text

Programación Reactiva para Desarrolladores Android Yury Camacho Google Developer Expert Android @camachoyury

Slide 4

Slide 4 text

Agenda ● Programación Reactiva ● Patron Observer ● RxJava ● Operaciones ● RxAndroid ● Ejemplos

Slide 5

Slide 5 text

Programación Reactiva #DevfestCochabama17 #quierosticker

Slide 6

Slide 6 text

Reactividad: Reaccionar a los eventos externos #DevfestCochabamba17

Slide 7

Slide 7 text

Que es la programación reactiva? “La programación reactiva es un paradigma de programación que está orientado a los flujos de datos(Streams) y propagación de los cambios de los datos en dicho flujo de forma asíncrona.” #DevfestCochabamba17

Slide 8

Slide 8 text

#DevfestCochabamba17

Slide 9

Slide 9 text

Características #DevfestCochabamba17

Slide 10

Slide 10 text

Patron Diseño Observer #DevfestCochabama17 #quierosticker

Slide 11

Slide 11 text

Patrón de diseño Observer “Es un patrón de diseño de software que define una dependencia del tipo uno a muchos entre objetos, de manera que cuando uno de los objetos cambia su estado, notifica este cambio a todos los dependientes. ” Wikipedia #DevfestCochabamba17

Slide 12

Slide 12 text

Observer Pattern #DevfestCochabamba17

Slide 13

Slide 13 text

RxJava RxAndroid #DevfestCochabama17 #quierosticker

Slide 14

Slide 14 text

RxJava ● Libreria ● Programación reactiva en Java/Android ● Tareas asíncronas ● Concurrencia ● Opreraciones sobre flujos de datos ● Codigo limpio #DevfestCochabamba17

Slide 15

Slide 15 text

● java.util.observable/observer ● Based GoF book Evolución RxJava ● RX.NET 2009 ● RxJS, Rxcpp, ● RxRuby, ReactiveCocoa ● RxJava 2012 Netflix ● RxJava 1.0 2014 ● Backpressure resuelto, ● subscriber ● Producer ● RxJava 2.0, 2016 ● Reactive Streams, ● Publisher ● Flowable #DevfestCochabamba17

Slide 16

Slide 16 text

3 Conceptos clave de Rx ● Observable(Publisher) objetos que emiten los datos ● Observer(Subscriber) objetos que se suscriben y que son notificados cuando el observable emite datos ● Schedulers Maneja la concurrencia indicando en qué thread deben ejecutarse el publisher y los subscribers #DevfestCochabamba17

Slide 17

Slide 17 text

Observable #DevfestCochabama17 #quierosticker Yo no fui

Slide 18

Slide 18 text

Observable Observable observable = Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { e.onNext("Yo"); e.onNext("No"); e.onNext("Fui"); e.onComplete(); } }); #DevfestCochabamba17

Slide 19

Slide 19 text

Observer #DevfestCochabama17 #quierosticker

Slide 20

Slide 20 text

Observer Observer observer = new Observer() {; @Override public void onNext(T s) { System.out.println("onNext(): " +s.toString()); } @Override public void onError(Throwable e) { System.out.println("onError(): " +e.getMessage()); } @Override public void onComplete() { System.out.println("Se completo e flujo" ); } }; #DevfestCochabamba17

Slide 21

Slide 21 text

Subscriber #DevfestCochabama17 #quierosticker

Slide 22

Slide 22 text

Subscribe observable.subscribe(observer); onNext(): Yo onNext(): No onNext(): Fui Se completo el flujo #DevfestCochabamba17

Slide 23

Slide 23 text

Otra O, Operators Operaciones que se realizan sobre los flujos de datos #DevfestCochabamba17

Slide 24

Slide 24 text

Diagramas Marble

Slide 25

Slide 25 text

Filter #DevfestCochabamba17

Slide 26

Slide 26 text

Filter Observable numObservable = Observable.just(1,2,3,4,5); numObservable.filter(integer -> integer > 2).subscribe(System.out::print); Resultado : 3,4, 5 #DevfestCochabamba17

Slide 27

Slide 27 text

Map

Slide 28

Slide 28 text

Filter Observable numObservable = Observable.just(1,2,3,4,5); numObservable.map(integer -> integer *10).subscribe(System.out::println) Resultado : 3,4, 5 #DevfestCochabamba17

Slide 29

Slide 29 text

RxAndroid ● Componentes rx especificos Android ● Agrega Schedules especificos Android #DevfestCochabamba17

Slide 30

Slide 30 text

Aplicaciones #DevfestCochabama17 #quierosticker

Slide 31

Slide 31 text

app/build.gradle compile 'io.reactivex.rxjava2:rxjava:2.0.0' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' //Para Kotlin compile 'io.reactivex.rxjava2:rxkotlin:2.1.0' #DevfestCochabamba17

Slide 32

Slide 32 text

Death to AsyncTasks public class MainController extends AsyncTask { // constructor, declaración de variables, etc..... @Override protected void onPreExecute() { view.showProgress();} @Override protected String doInBackground(String... strings) { try { return connectionController.getCurrentWeather(strings[0].toString()); } catch (Exception e) { return "ERROR"; } } @Override protected void onPostExecute(String result) { view.hideProgress(); if (result.equals("ERROR")) {view.showError(); } else { Forecast forecast = Parser.getForecast(result); view.updateData(forecast); } }

Slide 33

Slide 33 text

RxJava public class MainController { // constructor, decalracion de variables, etc..... public void updateWeather(){ view.showProgress(); // mostar el progreso repository.getWeather() // Request al servidor .subscribeOn(Schedulers.io()) // Ejecusion en un nuevo hilo .observeOn(AndroidSchedulers.mainThread()) // retorno al hilo principal .subscribe( forecast -> view.updateData(forecast), throwable -> view.showError(), () -> view.hideProgress()); } }

Slide 34

Slide 34 text

Ejemplos public Observable saveItem(SKU skul){ return tokenRepositoty.updateToken(user) .concatMap(token-> saveRemoteStorage(sku,token)) .concatMap(storedSku -> saveLocalStorage(storedSku)); }

Slide 35

Slide 35 text

Ejemplos public Observable> getSKUGroups(Long skuGroupId) { return api.getSKUGroups(skuGroupId) .map(skuGroupDetail -> skuGroupDetail.getSkus()); } } #DevfestCochabamba17

Slide 36

Slide 36 text

Ejemplos Observable> getListSKU(Long skuGroupId) { return repository.getSKUGroups(skuGroupId). flatMapIterable(skuList -> skuList) .map(sku -> new SKUViewModel().copyFromSKU(sku)). toList().toObservable(); } #DevfestCochabamba17

Slide 37

Slide 37 text

#DevfestCochabamba17

Slide 38

Slide 38 text

#DevfestCochabamba17

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

#DevfestCochabamba17

Slide 41

Slide 41 text

#DevfestCochabamba17 Fuente: http://five.agency/android-architecture-part-3-applying-clean-architecture-android/

Slide 42

Slide 42 text

View public interface WorldView { void onLoading(); void loadWorlds(List worlds); void hideLoading(); }

Slide 43

Slide 43 text

public class WorldFragment extends Fragment implements WorldView { private WorldPresenter presenter; //........ @Override public View onCreateView(.......) { presenter = new WorldPresenter(this); } @Override public void onStart() { presenter.loadWorlds(); } @Override public void onLoading() { progressBar.setVisibility(View.VISIBLE); } @Override public void loadWorlds(List worlds) { adapter.updateWorlds(worlds); } @Override public void hideLoading() { progressBar.setVisibility(View.GONE); } }

Slide 44

Slide 44 text

Presenter public class WorldPresenter { private WorldView mView; GetWorldListUseCase usecase; public WorldPresenter(WorldView view) { mView = view; } public void loadWorlds() { mView.onLoading(); useCase = new GetWorldListUseCase(); useCase.execute(new WorldObserver(), null); } public class WorldObserver extends DisposableObserver> { @Override public void onNext(List value) { mView.hideLoading(); mView.loadWorlds(value); } @Override public void onError(Throwable e) { mView.hideLoading(); } @Override public void onComplete() { mView.hideLoading(); } } }

Slide 45

Slide 45 text

public abstract class UseCase { private CompositeDisposable disposables; public UseCase() { this.disposables = new CompositeDisposable(); } abstract Observable buildUseCaseObservable(Params params); public void execute(DisposableObserver observer, Params params) { final Observable observable = this.buildUseCaseObservable(params) .subscribeOn(Schedulers.io()) // background thread .observeOn(AndroidSchedulers.mainThread());// observer on the AndroidSchedulers.mainThread() disposables.add(observable.subscribeWith(observer)); } }

Slide 46

Slide 46 text

public class GetWorldListInteractor extends UseCase,Void> { WorldRepositoryImpl repository; public GetWorldListInteractor() { repository = new WorldRepositoryImpl(); } @Override Observable> buildUseCaseObservable(Void aVoid) { return repository.getWorlds(); } }

Slide 47

Slide 47 text

public class GetWorldListInteractor extends UseCase,Void> { WorldRepositoryImpl repository; public GetWorldListInteractor() { repository = new WorldRepositoryImpl(); } @Override Observable> buildUseCaseObservable(Void aVoid) { return repository.getWorlds(); } }

Slide 48

Slide 48 text

public class WorldRepositoryImpl implements WorldRepository{ @Override public Observable> getWorlds() { WorldApi api = RestClient.getInstance().create(WorldApi.class); return api.getWorlds().map(WorldListResponse::getWorldList ); } }

Slide 49

Slide 49 text

#DevfestCochabamba17 IOS

Slide 50

Slide 50 text

Referencias https://github.com/ReactiveX/RxJava http://reactivex.io/documentation/operators.html https://github.com/ReactiveX/RxAndroid http://rxmarbles.com/ https://github.com/android10/Android-CleanArchitecture http://five.agency/android-architecture-part-3-applying-cle

Slide 51

Slide 51 text

Preguntas?

Slide 52

Slide 52 text

Gracias!!!!

Slide 53

Slide 53 text

Gracias! @camachoyury