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

Going Reactive with RxJava EXTENDED - @ jPrime Sofia 2016

Going Reactive with RxJava EXTENDED - @ jPrime Sofia 2016

Reactive programming is here to stay, so you might as well learn it!
It already made its mark on languages like Swift or C#, and now with major companies such as Netflix and Microsoft backing it up, it's time to do the same in Java. In this lecture we'll talk about RxJava library and how it can be used to make our applications more Reactive.
We'll peak into RxJava API a little bit, but more importantly, we'll focus on the concepts and the ideas that drive RxJava, and the value it adds to our applications.
Once we understand that, RxJava will be yet another great tool in our toolbox.

Hrvoje Crnjak

May 26, 2016
Tweet

More Decks by Hrvoje Crnjak

Other Decks in Programming

Transcript

  1. View Slide

  2. View Slide

  3. View Slide








  4. View Slide

  5. Reactive Manifesto

    View Slide





  6. View Slide

  7. View Slide

  8. View Slide

  9. View Slide


  10. View Slide

  11. • onNext
    • onCompleted
    • onError
    onNext
    onNext
    onNext
    onCompleted

    View Slide

  12. • onNext
    • onCompleted
    • onError
    onNext
    onNext
    onError

    View Slide

  13. • Observable.from
    • Observable.just

    • Observable.interval , Observable.range , Observable.empty
    Observable intervalObservable = Observable.interval(500L, TimeUnit.MILLISECODS);
    Observable rangeObservable = Observable.range(1, 10);
    Observable justObservable = Observable.just('R', 'x', 'J', 'a', 'v', 'a');
    List list = Arrays.asList("blue", "red", "green", "yellow", "orange");
    Observable listObservable = Observable.from(list)

    View Slide

  14. • Observable.create
    public static Observable getData(String someParameter) {
    return Observable.create(subscriber -> {
    try {
    SomeDataType result = SomeService.getData(someParameter);
    subscriber.onNext(result);
    subscriber.onCompleted();
    } catch (Exception e) {
    subscriber.onError(e);
    }
    });
    }

    View Slide

  15. • Observable.create
    public static Observable getData(String someParameter) {
    return Observable.create(subscriber -> {
    try {
    SomeDataType result = SomeService.getData(someParameter);
    subscriber.onNext(result);
    subscriber.onCompleted();
    } catch (Exception e) {
    subscriber.onError(e);
    }
    });
    }

    View Slide

  16. • observableInstance.subscribe
    observableInstance.subscribe(new Observer() {
    @Override
    public void onNext(SomeDataType message) {
    // Do something on each Message received
    }
    @Override
    public void onError(Throwable error) {
    // Do something on Error
    }
    @Override
    public void onCompleted() {
    // Do something when Observable completes
    }
    });

    View Slide

  17. • observableInstance.subscribe
    observableInstance.subscribe(
    (SomeDataType message) -> {/*onNext*/},
    (Throwable error) -> {/*onError*/},
    () -> {/*onCompleted*/});

    View Slide

  18. View Slide







  19. View Slide








  20. View Slide

  21. • filter(Func1 predicate)
    • skip(int num)
    • take(int num)
    • elementAt(int index)
    • distinct()
    • ...
    observableInstance.filter(element -> element < 10)
    observableInstance.elementAt(5)
    observableInstance.take(5)
    observableInstance.skip(5)

    View Slide

  22. • throttleFirst(long duration, TimeUnit unit)
    • throttleLast(long duration, TimeUnit unit)
    • timeout(long duration, TimeUnit unit)
    • ...
    observableInstance.throttleFirst(100, TimeUnit.MILLISECONDS)
    observableInstance.timeout(100, TimeUnit.MILLISECONDS)
    observableInstance.throttleLast(100, TimeUnit.MILLISECONDS)

    View Slide

  23. • map(Func1 func)
    • flatMap(Func1> func)
    • ...
    observableInstance.map(number -> number * number)
    observableInstance.flatMap(line -> Observable.from(line.split(“\\.”)))

    View Slide

  24. • zip(Iterable seq, FuncN func)
    • merge(Iterable seq)
    • amb(Iterable seq)
    • ...
    Observable timedObservable = Observable.zip(
    Observable.from(Arrays.asList("Z", "I", "P", "P")),
    Observable.interval(300L, TimeUnit.MILLISECONDS),
    (value, i) -> value);
    Observable mergedObservable = Observable
    .merge(firstObservable, secondObservable, thirdObservable);
    Observable fasterObservable = Observable
    .amb(firstObservable, secondObservable);

    View Slide

  25. Observable.range(1,9)
    .skipWhile(element -> element < 5)
    .take(3)
    .reduce((elem1, elem2) -> elem1 + elem2)
    .subscribe(result -> /*do something*/)

    View Slide

  26. View Slide

  27. • try/catch

    • onError

    onNext
    onNext
    onError

    View Slide



  28. • onErrorReturn , onErrorResumeNext, retry
    mainObservable.onErrorReturn(throwable -> {
    System.out.println("The original feed failed with" + throwable);
    return oneMoreMessage;
    }).subscribe(data -> {/* doSomething */});
    mainObservable.onErrorResumeNext(throwable -> {
    System.out.println("The original feed failed with" + throwable);
    return backupObservable;
    }).subscribe(data -> {/* doSomething */});

    View Slide

  29. View Slide





  30. View Slide




  31. Example

    View Slide

  32. main

    View Slide

  33. main
    observable.subscribe
    (onNext, onCompleted)

    View Slide

  34. main
    observable.subscribe
    (onNext, onCompleted)
    observable.subscribe
    remoteService.getData()

    View Slide

  35. main
    observable.subscribe
    (onNext, onCompleted)
    observable.subscribe
    remoteService.getData()
    remoteService.getData

    View Slide

  36. main
    observable.subscribe
    (onNext, onCompleted)
    observable.subscribe
    remoteService.getData()
    subscriber.onNext(data)

    View Slide

  37. main
    observable.subscribe
    (onNext, onCompleted)
    observable.subscribe
    remoteService.getData()
    subscriber.onNext(data)
    subscriber.onNext

    View Slide

  38. main
    observable.subscribe
    (onNext, onCompleted)
    observable.subscribe
    remoteService.getData()
    subscriber.onNext(data)
    subscriber.onCompleted()

    View Slide

  39. main
    observable.subscribe
    (onNext, onCompleted)
    observable.subscribe
    remoteService.getData()
    subscriber.onNext(data)
    subscriber.onCompleted()
    subscriber.onCompleted

    View Slide

  40. main
    observable.subscribe
    (onNext, onCompleted)
    observable.subscribe
    remoteService.getData()
    subscriber.onNext(data)
    subscriber.onCompleted()

    View Slide

  41. main
    observable.subscribe
    (onNext, onCompleted)
    remoteService.getData()
    subscriber.onNext(data)
    subscriber.onCompleted()

    View Slide

  42. observable.subscribe
    (onNext, onCompleted)
    remoteService.getData()
    subscriber.onNext(data)
    subscriber.onCompleted()

    View Slide

  43. • Observable
    • subscribeOn(Scheduler)
    • observeOn(Scheduler)
    • Schedulers
    • immediate –
    • newThread –
    • trampoline –
    • io –
    • computation –

    View Slide

  44. View Slide

  45. observable
    .subscribeOn(Schedulers.io())
    .observeOn(Schedulers.computation())
    .subscribe(onNext, onCompleted)

    View Slide

  46. observable
    .subscribeOn(Schedulers.io())
    .observeOn(Schedulers.computation())
    .subscribe(onNext, onCompleted)
    remoteService.getData()
    subscriber.onNext(data)

    View Slide

  47. observable
    .subscribeOn(Schedulers.io())
    .observeOn(Schedulers.computation())
    .subscribe(onNext, onCompleted)
    remoteService.getData()
    subscriber.onNext(data)

    View Slide

  48. observable
    .subscribeOn(Schedulers.io())
    .observeOn(Schedulers.computation())
    .subscribe(onNext, onCompleted)
    remoteService.getData()
    subscriber.onNext(data)
    subscriber.onCompleted()

    View Slide

  49. View Slide


  50. • subscribe

    • unsubscribe

    View Slide


  51. Subscription subscription = observableInstance.subscribe(
    (Long message) -> {/*onNext*/},
    (Throwable error) -> {/*onError*/},
    () -> {/*onCompleted*/});
    // Do some logic;
    subscription.unsubscribe();

    View Slide


  52. observableInstance.subscribe(new Subscriber() {
    @Override
    public void onNext(Long message) {
    // Do something on each Message received
    unsubscribe();
    }
    @Override
    public void onError(Throwable e) {
    // Do something on Error
    }
    @Override
    public void onCompleted() {
    // Do something when Observable completes
    }
    });

    View Slide

  53. View Slide

  54. View Slide




  55. View Slide



  56. View Slide




  57. View Slide



  58. View Slide












  59. View Slide







  60. View Slide


  61. View Slide







  62. View Slide











  63. View Slide

  64. View Slide