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

Getting your feet wet with RxJava

Getting your feet wet with RxJava

Presented in Feb '18 at JUG NCR Meetup, New Delhi.
https://www.meetup.com/Delhi-NCR-JUG/events/245487927/

Ragunath Jawahar

February 17, 2018
Tweet

More Decks by Ragunath Jawahar

Other Decks in Programming

Transcript

  1. Getting your feet wet with
    RxJava
    Ragunath Jawahar • @ragunathjawahar

    View Slide

  2. REACTIVE FUNCTIONAL

    View Slide

  3. FUNCTIONAL
    • Functions are first-class citizens
    • Immutability
    • No side-effects
    • Referential transparency
    • Declarative
    • Favours concurrency

    View Slide

  4. private boolean isDivisibleBy2(int number) {
    return number % 2 == 0;
    }
    Example 1

    View Slide

  5. private boolean isDivisibleBy2(int number) {
    return number % 2 == 0;
    }
    Example 1

    View Slide

  6. integers
    .stream()
    .map(number -> isDivisibleBy2(number) ? "Even" : "Odd");
    Example 2

    View Slide

  7. integers
    .stream()
    .map(number -> isDivisibleBy2(number) ? "Even" : "Odd");
    Example 2

    View Slide

  8. integers
    .stream()
    .map(number -> isDivisibleBy2(number) ? "Even" : "Odd");
    Example 2

    View Slide

  9. integers
    .stream()
    .map(number -> isDivisibleBy2(number) ? "Even" : "Odd");
    Example 2

    View Slide

  10. REACTIVE

    View Slide

  11. View Slide

  12. View Slide

  13. View Slide

  14. View Slide

  15. REACTIVE
    • Responsive
    • Resilient
    • Elastic
    • Message Driven

    View Slide

  16. REACTIVE
    • Speed Traps
    • Fire Alarms
    • Airbags
    • Autonomous Vehicles
    • Excel
    • GUI Systems
    • Hystrix
    Real World Examples

    View Slide

  17. ~ Callbacks ~
    An imperative way to build reactive systems.

    View Slide

  18. login(“username", “password", new Callback() {
    public void onSuccess(String authToken) {
    // Do something...
    }
    });

    View Slide

  19. login(“username", “password", new Callback() {
    public void onSuccess(String authToken) {
    // Do something...
    }
    });

    View Slide

  20. login(“username", “password", new Callback() {
    public void onSuccess(String authToken) {
    // Do something...
    }
    public void onFailure(Exception e) {
    // Show error message...
    }
    });

    View Slide

  21. RxJava

    View Slide

  22. A library for composing asynchronous and event-
    based programs using observable sequences for
    the Java VM.

    View Slide

  23. Where is it used?
    • Back-end to build highly scalable systems.
    • Front-end to create maintainable code.

    View Slide

  24. RxJava
    • Primitives
    • Operators

    View Slide

  25. Primitive - Observable
    • Produces events
    • Usually lazy
    • Can produce one, many or zero events
    •Serialized access

    View Slide

  26. button
    .setOnClickListener(click -> doSomething());
    buttonClicksObservable
    .subscribe(click -> doSomething());
    Callback
    RxJava

    View Slide

  27. button
    .setOnClickListener(click -> doSomething());
    buttonClicksObservable
    .subscribe(click -> doSomething());
    Callback
    RxJava

    View Slide

  28. button
    .setOnClickListener(click ->
    api.authenticate(username, password, new Callback() {
    public void onSuccess(String authToken) {
    // Save Token
    }
    public void onLoginFailed(LoginException e) {
    // Show Error
    }
    })
    );
    Callback

    View Slide

  29. button
    .setOnClickListener(click ->
    api.authenticate(username, password, new Callback() {
    public void onSuccess(String authToken) {
    // Save Token
    }
    public void onLoginFailed(LoginException e) {
    // Show Error
    }
    })
    );
    Callback

    View Slide

  30. button
    .setOnClickListener(click ->
    api.authenticate(username, password, new Callback() {
    public void onSuccess(String authToken) {
    // Save Token
    }
    public void onLoginFailed(LoginException e) {
    // Show Error
    }
    })
    );
    Callback

    View Slide

  31. button
    .setOnClickListener(click ->
    api.authenticate(username, password, new Callback() {
    public void onSuccess(String authToken) {
    // Save Token
    }
    public void onLoginFailed(LoginException e) {
    // Show Error
    }
    })
    );
    Callback

    View Slide

  32. button
    .setOnClickListener(click ->
    api.authenticate(username, password, new Callback() {
    public void onSuccess(String authToken) {
    // Save Token
    }
    public void onLoginFailed(LoginException e) {
    // Show Error
    }
    })
    );
    Callback

    View Slide

  33. button
    .setOnClickListener(click ->
    api.authenticate(username, password, new Callback() {
    public void onSuccess(String authToken) {
    // Save Token
    }
    public void onLoginFailed(LoginException e) {
    // Show Error
    }
    })
    );
    Callback

    View Slide

  34. buttonClicksObservable
    .flatMap(click -> api.authenticate(username, password))
    .onErrorReturn(null)
    .subscribe(authToken ->
    if (authToken != null) saveToken(authToken) else showError();
    );
    RxJava

    View Slide

  35. buttonClicksObservable
    .flatMap(click -> api.authenticate(username, password))
    .onErrorReturn(null)
    .subscribe(authToken ->
    if (authToken != null) saveToken(authToken) else showError();
    );
    RxJava

    View Slide

  36. buttonClicksObservable
    .flatMap(click -> api.authenticate(username, password))
    .onErrorReturn(null)
    .subscribe(authToken ->
    if (authToken != null) saveToken(authToken) else showError();
    );
    RxJava

    View Slide

  37. buttonClicksObservable
    .flatMap(click -> api.authenticate(username, password))
    .onErrorReturn(null)
    .subscribe(authToken ->
    if (authToken != null) saveToken(authToken) else showError();
    );
    RxJava

    View Slide

  38. buttonClicksObservable
    .flatMap(click -> api.authenticate(username, password))
    .onErrorReturn(null)
    .subscribe(authToken ->
    if (authToken != null) saveToken(authToken) else showError();
    );
    RxJava

    View Slide

  39. buttonClicksObservable
    .flatMap(click -> api.authenticate(username, password))
    .onErrorReturn(null)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(authToken ->
    if (authToken != null) saveToken(authToken) else showError();
    );
    RxJava

    View Slide

  40. Observable - Anatomy
    Data
    Error
    Completion

    View Slide

  41. Observable - Anatomy
    Data
    Error
    Completion

    View Slide

  42. Observable - Anatomy
    Data
    Error
    Completion

    View Slide

  43. Observable - Anatomy
    Data
    Error
    Completion

    View Slide

  44. Primitive - Subscriber
    • onNext(T)
    • onError(Throwable)
    • onComplete()

    View Slide

  45. RxJava - Operators
    • Single Observable
    • Multiple Observable
    • Higher-Order Observables
    •Finite and infinite Observables (any of the
    above)

    View Slide

  46. Marble Diagrams

    View Slide

  47. filter

    View Slide

  48. map

    View Slide

  49. debounce

    View Slide

  50. delay

    View Slide

  51. interval

    View Slide

  52. amb

    View Slide

  53. merge

    View Slide

  54. combineLatest

    View Slide

  55. zip

    View Slide

  56. flatMap

    View Slide

  57. onError*

    View Slide

  58. retry*

    View Slide

  59. Error Handling
    • Exceptions are normal
    • Error handling operators
    • Retry operators

    View Slide

  60. Declarative Threading
    • Using Schedulers
    • subscribeOn(Scheduler)
    • observeOn(Scheduler)

    View Slide

  61. Debugging
    • Could be a pain 
    • Use doOn* operators to inspect the
    pipeline
    • Traceur (RxJava 2)

    View Slide

  62. Testing
    • Mockito
    • Subjects / Relays

    View Slide

  63. Further Reading
    André Staltz

    View Slide

  64. Questions?

    View Slide