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

Reactive programming on Android

Reactive programming on Android

Android Dev Saigon meet up #3
Twitter: @thanhbc1990
Github demo: github.com/thanhbc/popularmovies

Thanh Chinh Ban

February 27, 2016
Tweet

More Decks by Thanh Chinh Ban

Other Decks in Programming

Transcript

  1. Ban Chính Thành • A Little ninja at PrimeLabo •

    Android developer for over 2 years Email:[email protected] Github: http://github.com/thanhbc
  2. RxJava is a library that let’s you represent anything as

    asynchronous data-stream (event stream) that can be create on any thread, functionally transformed, and consumed by everyone on any thread.
  3. Represent anything that can be created on any thread and

    consumed on any thread as a data stream functionally transformed by everyone
  4. Events Click events Text change events Keyboard pressed events Network

    response events Sign in events … endless possibilities.
  5. Observer Pattern public interface Observer<T>{
 public abstract void onCompleted();
 public

    abstract void onError(Throwable e);
 public abstract void onNext(T t);
 } public interface Observable<T>{
 public Subscription subscribe(Observer<? super T> subscriber);
 } Observable Observer subscribe emit items
  6. Observable.just • Convert an object or several objects into an

    Observable Observable.just("Hello Guys!")
  7. Observer • Observer is the one who received in data

    • Observer and Observable connected through subscribe method - Subscriptions • Observer through subscribe to listen an Observable
  8. Subscribe • Connect Observable and Observer • Need to be

    implemented Observer interface • onNext, onError, onComplete public final Subscription subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError, final Action0 onComplete) {
 /*..*/ }
  9. Observable.just("Hello Guys!").subscribe(new Action1<String>() {
 @Override
 public void call(String s) {


    Log.d(TAG, ">>>>>>>" + s + "<<<<<<<");
 }
 });
 
 Observable.just("Hello Guys!")
 .subscribe(new Action1<String>() {
 @Override
 public void call(String s) {
 Log.d(TAG, ">>>>>>>" + s + "<<<<<<<");
 }
 }, new Action1<Throwable>() {
 @Override
 public void call(Throwable throwable) {
 Log.d(TAG, ">>>>>>> Error, cant say hi to your guys <<<<<<<");
 }
 }, new Action0() {
 @Override
 public void call() {
 Log.d(TAG, ">>>>>>> Completed <<<<<<<");
 }
 }); Or just Out put: >>>>>>>Hello Guys!<<<<<<< >>>>>>> Completed <<<<<<< Out put: >>>>>>>Hello Guys!<<<<<<<
  10. Observable.from • Convert an Iterable, a Future, or an Array

    into an Observable Observable.from(listOfInteger)
  11. Observable.from List<Integer> integers = new ArrayList<>();
 integers.add(1);
 integers.add(2);
 integers.add(3);
 integers.add(4);


    integers.add(5);
 
 Observable.from(integers).subscribe(new Action1<Integer>() {
 @Override
 public void call(Integer integer) {
 Log.d(TAG, ">>>>>>> integer: " + integer);
 }
 }); Out put: >>>>>>> integer: 1 >>>>>>> integer: 2 >>>>>>> integer: 3 >>>>>>> integer: 4 >>>>>>> integer: 5
  12. Memory leak fix public void detachView() {
 if(searchResultSubscription != null

    && !searchResultSubscription.isUnsubscribed())
 searchResultSubscription.unsubscribe();
 }
  13. “Hot” & “Cold” Observable • When an Observable emit datas?

    • Hot Observable • When it created • Cold Observable • When an observer subscribe
  14. Operators • Creating Observables (ex: create, from, just, …) •

    Transforming Observables (ex: map, flatMap, …) • Filtering Observables • Combining Observables • ErrorHandling Operators • Observable Utility Operators • see example on http://rxmarbles.com & PlayStore available
  15. Transform via Map Observable<DiscoverMovie> observable = service.getSearchResult(encodedQuery, TheMovieDBService.API_KEY);
 searchResultSubscription =

    observable
 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread()) 
 .subscribe(searchResultsSubscriber());
 .map(new Func1<DiscoverMovie, List<Result>>() {
 @Override
 public List<Result> call(DiscoverMovie searchResult) {
 return searchResult.results; // list of movies info
 }
 })
 DiscoverMovie transformed to List<Result>
  16. Why? (Android) Main/UI Thread and background problem • Can’t do

    heavy tasks on UI • Can’t update view on background • AsyncTasks are bad • Handlers can leak
  17. Synchronous Observable.create(new Observable.OnSubscribe<String>() {
 @Override
 public void call(Subscriber<? super String>

    subscriber) {
 String threadID = String.valueOf(Thread.currentThread().getId());
 Log.d(TAG,"working on thread: " + threadID);
 subscriber.onNext("Android");
 subscriber.onNext("Meetup #3");
 subscriber.onCompleted();
 }
 })
 .subscribe(new Action1<String>() {
 @Override
 public void call(String s) {
 String threadID = String.valueOf(Thread.currentThread().getId());
 Log.d(TAG,"onNext on thread: " + threadID + );
 }
 }); Out put: working on thread: 1 onNext on thread: 1 -> Android onNext on thread: 1 -> Meetup #3
  18. Asynchronous Observable.create(new Observable.OnSubscribe<String>() {
 @Override
 public void call(Subscriber<? super String>

    subscriber) {
 String threadID = String.valueOf(Thread.currentThread().getId());
 Log.d(TAG,"working on thread: " + threadID);
 subscriber.onNext("Android");
 subscriber.onNext("Meetup #3");
 subscriber.onCompleted();
 }
 })
 .observeOn(Schedulers.newThread())
 .subscribe(new Action1<String>() {
 @Override
 public void call(String s) {
 String threadID = String.valueOf(Thread.currentThread().getId());
 Log.d(TAG, "onNext on thread: " + threadID + " -> " + s);
 }
 }); Out put: working on thread: 1 onNext on thread: 525 -> Android onNext on thread: 525 -> Meetup #3
  19. Asynchronous Observable.create(new Observable.OnSubscribe<String>() {
 @Override
 public void call(Subscriber<? super String>

    subscriber) {
 String threadID = String.valueOf(Thread.currentThread().getId());
 Log.d(TAG,"working on thread: " + threadID);
 subscriber.onNext("Android");
 subscriber.onNext("Meetup #3");
 subscriber.onCompleted();
 }
 })
 .observeOn(Schedulers.newThread())
 .subscribeOn(Schedulers.newThread())
 .subscribe(new Action1<String>() {
 @Override
 public void call(String s) {
 String threadID = String.valueOf(Thread.currentThread().getId());
 Log.d(TAG, "onNext on thread: " + threadID + " -> " + s);
 }
 }); Out put: working on thread: 529 onNext on thread: 532 -> Android onNext on thread: 532 -> Meetup #3
  20. Represent anything that can be created on any thread and

    consumed on any thread as a data stream functionally transformed by everyone Observable<T> Scheduler Operators Subscriber<T> Scheduler
  21. Useful links • Grokking RxJava by Dan Lew • ReactiveX

    / RxJava • reactivex.io • rxmarble
  22. We’re hiring! • Senior Android & iOS • Android &

    iOS developer • Java Programmer • VB6