Transcript
Page 1: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
Page 2: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Getting Started

RxJava

David Wursteisen 16 Octobre 2014

Page 3: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

David Wursteisen

@dwursteisen

Direction Expertise Innovation

Page 4: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

David Wursteisen

Page 5: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Architecture distribuée

Sync/Async/Concurrence

Page 6: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Architecture distribuée

Page 7: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Architecture distribuée

Page 8: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Architecture distribuée

The Internet

Page 9: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Architecture distribuée

The Internet

Page 10: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Synchrone

Page 11: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Synchrone

Appel bloquant

Page 12: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Asynchrone

Page 13: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Asynchrone

Appel non bloquant

Page 14: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

Page 15: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

future.get();

Page 16: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

future1.get();future2.get();future3.get();future4.get();future5.get();future6.get();future7.get();

Page 17: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

future1.get();future2.get();future3.get();future4.get();future5.get();future6.get();future7.get();

Ordonnancement optimal ?

Page 18: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

client.execute(new Callback() { @Override public void completed(HttpResponse response) { }});

Page 19: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

client.execute(new Callback() { @Override public void completed(HttpResponse response) { client.execute(new Callback() { @Override public void completed(HttpResponse response) { } });

}});

Page 20: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

client.execute(new Callback() { @Override public void completed(HttpResponse response) { client.execute(new Callback() { @Override public void completed(HttpResponse response) { client.execute(new Callback() { @Override public void completed(HttpResponse response) { } }); }});

}});

Page 21: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

client.execute(new Callback() { @Override public void completed(HttpResponse response) { client.execute(new Callback() { @Override public void completed(HttpResponse response) { client.execute(new Callback() { @Override public void completed(HttpResponse response) { } }); }});

}});

Callback hell

Page 22: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

Page 23: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

Page 24: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

Concurrence

Page 25: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

Page 26: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

RxJava permet de manipuler des évènements d’une manière synchrone et/ou asynchrone.

Page 27: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

Il était une fois...

Page 28: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

Page 29: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

Page 30: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

Page 31: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

Page 32: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

ReactiveX.io

Page 33: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observables

Travailler avec des flux

Page 34: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements fini

Évènements Fin du flux

Page 35: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements en erreur

Évènements Erreur

Page 36: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements infini

Évènements

Page 37: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

Page 38: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

Page 39: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

1

Page 40: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

1 2 3

Page 41: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

1 4400

Page 42: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

0

t

t + 5 secondes

Page 43: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

A C

Page 44: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

λ ϕ φ

json json jsonObservable<json>

Observable<Integer>

Observable<Click>

Page 45: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Push des données

Page 46: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

OnNext* (OnCompleted|OnError)?

Page 47: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

OnNext* (OnCompleted|OnError)?

Page 48: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

OnNext* (OnCompleted|OnError)?

Page 49: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

OnNext* (OnCompleted|OnError)?

Page 50: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400)

Page 51: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe()

Page 52: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(onNext)

Page 53: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(System.out::println)

Page 54: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(System.out::println, onError)

Page 55: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(System.out::println, System.err::println)

Page 56: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(System.out::println, System.err::println,onCompleted)

Page 57: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(System.out::println, System.err::println,

() -> System.out.println(“finished”))

Page 58: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Quand l’écoute ne suffit plus

Page 59: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

0 1

Page 60: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

0 1

map

Page 61: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

0 1

A B

map

Page 62: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 4

Page 63: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 4

filter ( x <= 2 )

Page 64: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 4

1

filter ( x <= 2 )

Page 65: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 2

Page 66: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 2

delay ( 5, SECONDS )

Page 67: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 2

1

delay ( 5, SECONDS )

2

Page 68: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4)

Observable<Integer>

Page 69: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4) .filter((i) -> i < 3)

Observable<Integer>Observable<Integer>

Page 70: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4) .filter((i) -> i < 3) .delay(5, TimeUnit.SECONDS)

Observable<Integer>Observable<Integer>Observable<Integer>

Page 71: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4) .filter((i) -> i < 3) .delay(5, TimeUnit.SECONDS) .map((i) -> Character.toString((char)(i + 'A')))

Observable<Integer>Observable<Integer>Observable<Integer>

Observable<String>

Page 72: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4) .filter((i) -> i < 3) .delay(5, TimeUnit.SECONDS) .map((i) -> Character.toString((char)(i + 'A'))) .subscribe(System.out::println);

Observable<Integer>Observable<Integer>Observable<Integer>

Observable<String>

Page 73: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4) .filter((i) -> i < 3) .delay(5, TimeUnit.SECONDS) .map((i) -> Character.toString((char)(i + 'A'))) .subscribe(System.out::println);

0, 1, 2, 3, 4 => A, B, C

Observable<Integer>Observable<Integer>Observable<Integer>

Observable<String>

Page 74: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Page 75: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Page 76: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Page 77: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Création d’un flux à partir d’un ensemble de flux

Page 78: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 79: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 80: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 81: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Mise en pratique de composition

Learn from the trenches

Page 82: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 83: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 84: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 85: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 86: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 87: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

merge

Page 88: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

merge

Page 89: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 90: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 91: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

zip

Page 92: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

zip

Page 93: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Et gestion de l’unsubscribe

Page 94: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { … });

Page 95: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() {

@Override public void call(Subscriber<? super T> s) { s.onNext(123); s.onCompleted(); }

});

Page 96: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() {

@Override public void call(Subscriber<? super T> s) { s.onNext(123); s.onCompleted(); }

});

Émission synchronne

Page 97: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { // ... httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { @Override public void completed(String content) { subscriber.onNext(content); subscriber.onCompleted(); }

@Override public void failed(Exception e) { subscriber.onError(e); } }); }});

Page 98: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { // ... httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { @Override public void completed(String content) { subscriber.onNext(content); subscriber.onCompleted(); }

@Override public void failed(Exception e) { subscriber.onError(e); } }); }});

Page 99: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { // ... httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { @Override public void completed(String content) { subscriber.onNext(content); subscriber.onCompleted(); }

@Override public void failed(Exception e) { subscriber.onError(e); } }); }});

Page 100: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { // ... httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { @Override public void completed(String content) { subscriber.onNext(content); subscriber.onCompleted(); }

@Override public void failed(Exception e) { subscriber.onError(e); } }); }});

Émission asynchronne

Page 101: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { // ... httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { @Override public void completed(String content) { subscriber.onNext(content); subscriber.onCompleted(); }

@Override public void failed(Exception e) { subscriber.onError(e); } }); }});

Propagation des erreurs

Page 102: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

La souscription permet d’uniformiser des API différentes par leurs natures (Callback, etc...)

Page 103: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Unsubscribe

Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();

Page 104: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Unsubscribe

Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();

Souscription

Page 105: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Unsubscribe

Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();

Handler sur la souscription

Page 106: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Unsubscribe

Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();/* ... */subscription.unsubscribe();

Page 107: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Unsubscribe

Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();/* ... */subscription.unsubscribe();

Arrêt de la souscription

Page 108: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Page 109: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

observableReadingSynchronously(“strings.txt”)

.take(10) .delay(1, SECONDS) .map(parse())

.map(n -> “=> ” + n)) .subscribe(to_the_view())

Page 110: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

main

Page 111: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

observableReadingSynchronously(“strings.txt”)

.take(10) .delay(1, SECONDS) .map(parse())

.map(n -> “=> ” + n)) .subscribe(to_the_view())

Page 112: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 113: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 114: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 115: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 116: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 117: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 118: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

observableReadingSynchronously(“strings.txt”) .subscribeOn(scheduler) .take(10) .delay(1, SECONDS, scheduler) .map(parse()) .observeOn(scheduler) .map(n -> “=> ” + n)) .subscribe(to_the_view())

Page 119: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

observableReadingSynchronously(“strings.txt”) .subscribeOn(Schedulers.io()) .take(10) .delay(1, SECONDS, Schedulers.computation()) .map(parse()) .observeOn(Schedulers.from(uiExecutor())) .map(n -> “=> ” + n)) .subscribe(to_the_view())

Page 120: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

UI

Computation

Page 121: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

UI

Computation

Page 122: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

UI

Computation

Page 123: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

UI

Computation

Page 124: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

UI

Computation

Page 125: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot & Cold Observable

Page 126: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold Observable

Observable<Integer> obs = Observable.from(1, 2, 3, 4);

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

Page 127: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold Observable

Observable<Integer> obs = Observable.from(1, 2, 3, 4);

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

Page 128: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold Observable

Observable<Integer> obs = Observable.from(1, 2, 3, 4);

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

Subscribe

Page 129: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold Observable

Observable<Integer> obs = Observable.from(1, 2, 3, 4);

obs.subscribe(System.out::println);

obs.subscribe(System.out::println); Subscribe

Page 130: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold Observable

Observable<Integer> obs = Observable.from(1, 2, 3, 4);

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);Souscription différente

Page 131: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 132: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 133: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 134: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 135: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 136: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();Subscribe

Page 137: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Partage la même souscription

Page 138: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 139: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.connect();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

Souscription

Page 140: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold & Hot Observable

Cold Observable = flux passif

Hot Observable = flux actif

Page 141: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Back Pressure

Contrôler la production

Page 142: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Back Pressure

Production

Page 143: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Back Pressure

Production

buffer

Page 144: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Back Pressure

Production

Pression arrière

Page 145: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Back Pressure

Production

Pression arrière

Demande de production de n élements

Page 146: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Retour d’expérience

Page 147: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Opérateurs

Observable.from(1, 2, 3, 4) .reduce(new LinkedList<Integer>(), (seed, value) -> { seed.add(value); return seed; }) .first() .subscribe(System.out::println);

Page 148: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Opérateurs

Observable.from(1, 2, 3, 4) .reduce(new LinkedList<Integer>(), (seed, value) -> { seed.add(value); return seed; }) .first() .subscribe(System.out::println);

Page 149: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Opérateurs

Observable.from(1, 2, 3, 4) .toList() .first() .subscribe(System.out::println);

Page 150: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Opérateurs

Observable.from(1, 2, 3, 4) .toList() .first() .subscribe(System.out::println);

Page 151: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Opérateurs

Observable.from(1, 2, 3, 4) .toList() .first() .subscribe(System.out::println);

Différence entre first() / single() / take(1) ?

Page 152: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Gestion des erreurs

Observable.from(1, 2, 3, 4) .toList() .single() .subscribe(System.out::println);

Page 153: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Gestion des erreurs

Observable.from(1, 2, 3, 4) .toList() .single() .subscribe(System.out::println);

Notification des erreurs absentes

Page 154: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Gestion des erreurs

static { RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() { @Override public void handleError(Throwable e) { e.printStackTrace(); } });}

Page 155: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Lambda & Java 8

Observable.from(1, 2, 3, 4) .filter(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer i) { return i > 3; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer x) { System.out.println(x); } });

Page 156: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Lambda & Java 8

Observable.from(1, 2, 3, 4) .filter(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer i) { return i > 3; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer x) { System.out.println(x); } });

Bruit

Page 157: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Lambda & Java 8

Observable.from(1, 2, 3, 4) .filter(i -> i > 3) .subscribe(System.out::println);

Page 158: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Lambda & Java 8

Observable.from(1, 2, 3, 4) .filter(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer i) { return i > 3; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer x) { System.out.println(x); } });

Observable.from(1, 2, 3, 4) .filter(i -> i > 3) .subscribe(System.out::println);

Retrolambda

Page 159: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

obs1.mergeWith(obs2) .take(5) .subscribe(System.out::println);

Page 160: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

obs1.mergeWith(obs2) .take(5) .subscribe(System.out::println);

Page 161: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

obs1.mergeWith(obs2) .take(5) .subscribe(System.out::println);

Doit gérer la concurrence

Page 162: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

obs1.mergeWith(obs2) .take(5) .subscribe(System.out::println);

Page 163: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

obs1.mergeWith(obs2) .take(5) .subscribe(System.out::println);

non concurrence

Page 164: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Sync & Async

Observable<Integer> generator();

Page 165: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Sync & Async

Observable<Integer> generator();

Sync ?

Page 166: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Sync & Async

Observable<Integer> generator();

Sync ? Async ?

Page 167: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Sync & Async

Observable<Integer> generator();

Sync ? Async ?

Computation ?

Page 168: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Sync & Async

Observable<Integer> generator();

Sync ? Async ?

Computation ? Acteur ?

Page 169: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

“Leak” des Observables

everything is an event

Page 170: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

“Leak” des Observables

ViewPager

Page 171: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

“Leak” des Observables

ViewPager

Preferences

Observable

Page 172: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

“Leak” des Observables

ViewPager

Preferences

UserService

Observable

Observable

Page 173: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Future<RxJava>

Page 174: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Future<RxJava>

Support RxJava

Page 175: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

Page 176: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure on the JVM.

http://www.reactive-streams.org/

Page 177: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

RxJava | Akka Streams | Reactor Composable | Ratpack

Page 178: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

RxJava | Akka Streams | Reactor Composable | Ratpack

> 700 Ko | Java | Android

Page 179: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

RxJava | Akka Streams | Reactor Composable | Ratpack

> 2.5 Mo | Scala | Akka

Page 180: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

RxJava | Akka Streams | Reactor Composable | Ratpack

~1Mo | Java | RingBufferDispatcher

Page 181: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

RxJava | Akka Streams | Reactor Composable | Ratpack

Java 8 | Http

Page 182: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Si il ne fallait retenir qu’une chose

Page 183: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Si il ne fallait retenir qu’une chose

RxJava est un modèle de programmation pour écrire des applications asynchrones

Frontend | Backend | Crossplatform

Page 184: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Questions ?

[email protected]@dwursteisen


Top Related