RxJava, Getting Started - David Wursteisen - 16 Octobre 201419. Complexité
client.execute(new Callback() {
@Override
public void completed(HttpResponse response) {
client.execute(new Callback() {
@Override
public void completed(HttpResponse response) {
}
});
}
});
20. 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) {
}
});
}
});
21. 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
37. 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(...)
38. 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(...)
39. 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
40. 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
41. 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
42. 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
43. 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
71. 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>
72. 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>
73. 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>
97. 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);
}
});
}
});
98. 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);
}
});
}
});
99. 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);
}
});
}
});
100. 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
101. 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
105. Unsubscribe
Handler sur la souscription
Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();
140. Cold & Hot Observable
Cold Observable = flux passif
Hot Observable = flux actif
147. Opérateurs
Observable.from(1, 2, 3, 4)
.reduce(new LinkedList<Integer>(), (seed, value) -> {
seed.add(value);
return seed;
})
.first()
.subscribe(System.out::println);
148. Opérateurs
Observable.from(1, 2, 3, 4)
.reduce(new LinkedList<Integer>(), (seed, value) -> {
seed.add(value);
return seed;
})
.first()
.subscribe(System.out::println);
152. Gestion des erreurs
Observable.from(1, 2, 3, 4)
.toList()
.single()
.subscribe(System.out::println);
153. Gestion des erreurs
Observable.from(1, 2, 3, 4)
.toList()
.single()
.subscribe(System.out::println);
Notification des erreurs absentes
154. Gestion des erreurs
static {
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() {
@Override
public void handleError(Throwable e) {
e.printStackTrace();
}
});
}
155. 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);
}
});
156. 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
157. Lambda & Java 8
Observable.from(1, 2, 3, 4)
.filter(i -> i > 3)
.subscribe(System.out::println);
158. 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
166. Sync & Async
Sync ? Async ?
Observable<Integer> generator();
167. Sync & Async
Sync ? Async ?
Observable<Integer> generator();
Computation ?
168. Sync & Async
Sync ? Async ?
Observable<Integer> generator();
Computation ? Acteur ?
176. 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/
182. Si il ne fallait retenir qu’une chose
183. Si il ne fallait retenir qu’une chose
RxJava est un modèle de programmation pour
écrire des applications asynchrones
Frontend | Backend | Crossplatform