Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Programacion

Yury Camacho
November 25, 2017

 Programacion

Una introducción con ejemplos de programación Reactiva en android

Yury Camacho

November 25, 2017

Transcript

53 slides
  1. 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
  2. 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
  3. 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
  4. RxJava • Libreria • Programación reactiva en Java/Android • Tareas

    asíncronas • Concurrencia • Opreraciones sobre flujos de datos • Codigo limpio #DevfestCochabamba17
  5. • 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
  6. 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
  7. Observable Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() { @Override public void

    subscribe(ObservableEmitter<String> e) throws Exception { e.onNext("Yo"); e.onNext("No"); e.onNext("Fui"); e.onComplete(); } }); #DevfestCochabamba17
  8. Observer Observer<T> observer = new Observer<T>() {; @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
  9. Map

  10. Death to AsyncTasks public class MainController extends AsyncTask<String, Void,String> {

    // 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); } }
  11. 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()); } }
  12. Ejemplos Observable<List<SKUViewModel>> getListSKU(Long skuGroupId) { return repository.getSKUGroups(skuGroupId). flatMapIterable(skuList -> skuList)

    .map(sku -> new SKUViewModel().copyFromSKU(sku)). toList().toObservable(); } #DevfestCochabamba17
  13. 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<World> worlds) { adapter.updateWorlds(worlds); } @Override public void hideLoading() { progressBar.setVisibility(View.GONE); } }
  14. 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<List<World>> { @Override public void onNext(List<World> value) { mView.hideLoading(); mView.loadWorlds(value); } @Override public void onError(Throwable e) { mView.hideLoading(); } @Override public void onComplete() { mView.hideLoading(); } } }
  15. public abstract class UseCase<T, Params> { private CompositeDisposable disposables; public

    UseCase() { this.disposables = new CompositeDisposable(); } abstract Observable<T> buildUseCaseObservable(Params params); public void execute(DisposableObserver<T> observer, Params params) { final Observable<T> observable = this.buildUseCaseObservable(params) .subscribeOn(Schedulers.io()) // background thread .observeOn(AndroidSchedulers.mainThread());// observer on the AndroidSchedulers.mainThread() disposables.add(observable.subscribeWith(observer)); } }
  16. public class GetWorldListInteractor extends UseCase<List<World>,Void> { WorldRepositoryImpl repository; public GetWorldListInteractor()

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

    { repository = new WorldRepositoryImpl(); } @Override Observable<List<World>> buildUseCaseObservable(Void aVoid) { return repository.getWorlds(); } }
  18. public class WorldRepositoryImpl implements WorldRepository{ @Override public Observable<List<World>> getWorlds() {

    WorldApi api = RestClient.getInstance().create(WorldApi.class); return api.getWorlds().map(WorldListResponse::getWorldList ); } }

More Decks by Yury Camacho

Other Decks in Technology