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

Going Reactive with RxJava - @ TopConf Linz 2016

Going Reactive with RxJava - @ TopConf Linz 2016

Reactive programming is here to stay, so you might as well learn it!

It has already become a favourite tool in the toolboxes of many Swift or C# developers, and now with major companies such as Netflix and Microsoft backing it up, it is time to make it's mark on Java.

In this lecture we'll talk about RxJava library and how it can be used together with all the new nifty features from Java 8.

But more importantly, we'll try to get to the bottom of what it actually means to use the concepts of Reactive programming in our applications.
Once we understand that, RxJava will be yet another great tool in our toolbox.

Hrvoje Crnjak

February 02, 2016
Tweet

More Decks by Hrvoje Crnjak

Other Decks in Programming

Transcript

  1. View Slide

  2. View Slide

  3. Reactive Manifesto

    View Slide





  4. View Slide

  5. View Slide

  6. View Slide

  7. View Slide


  8. View Slide

  9. • onNext
    • onCompleted
    • onError
    onNext
    onNext
    onNext
    onCompleted

    View Slide

  10. • onNext
    • onCompleted
    • onError
    onNext
    onNext
    onError

    View Slide

  11. • 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

  12. • 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

  13. • 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

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

    View Slide

  15. View Slide







  16. View Slide







  17. View Slide





  18. observableInstance.filter(element -> element < 10)
    observableInstance.timeout(100, TimeUnit.MILLISECONDS)
    observableInstance.map(number -> number * number)
    Observable mergedObservable = Observable
    .merge(firstObservable, secondObservable, thirdObservable);

    View Slide

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

    View Slide

  20. View Slide

  21. • try/catch

    • onError

    onNext
    onNext
    onError

    View Slide



  22. • onError , 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

  23. View Slide





  24. View Slide

  25. main

    View Slide

  26. main
    observable.subscribe
    (onNext, onCompleted)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  37. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  42. View Slide


  43. • subscribe

    • unsubscribe

    View Slide


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

    View Slide


  45. 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

  46. View Slide

  47. View Slide