The ABCs of RxJava
-
Upload
florina-muntenescu -
Category
Software
-
view
512 -
download
0
Transcript of The ABCs of RxJava
11
The ABCs of RxJavaFlorinaMuntenescu@FMuntenescu
22
The ABCs of RxJavaMaking a BurgerFlorinaMuntenescu@FMuntenescu
3
Donald Duck’s Burger Joint
4
Huey Dewey Louie
5
Huey
6
Dewey
7
Louie
8
Huey
Dewey
Louie
9
filter(meat -> isMeatFresh(meat))
map(meat -> cook(meat))
Dewey
10
zip
11
zip
12
zip
13
zip
14
STREAMSOFDATA
15
STREAMSOFDATA
16
STREAMSOFDATA
17
zip
STREAMSOFDATA
18Consumer
Observable
Subscriber
19
filter(meat -> isMeatFresh(meat))
map(meat -> cook(meat))
operators
20
Huey.getBun()
21
filter(meat -> isMeatFresh(meat))
for(Meat meat: meatList){if(!isMeatFresh(meat)){
meatList.remove(meat);}
}
22
Observable.from(meatSource).filter(meat ->
isMeatFresh(meat))
filter(meat -> isMeatFresh(meat))
23
filter(meat -> isMeatFresh(meat))
map(meat -> cook(meat))
for(Meat meat: meatList){meat = cook(meat);
}
24
Observable.from(meatSource).filter(meat ->
isMeatGoneBad(meat)).map(meat -> cook(meat));
filter(meat -> isMeatFresh(meat))
map(meat -> cook(meat))
25
Observable<Burger> burgerObservable = Observable.zip(bunObservable,
meatObservable,tomatoObservable,(bun, meat, tomato) -> makeBurger(bun, meat, tomato))
bunObservable
meatObservable
tomatoObservable
burgerObservable
26
Observable<Burger> burgerObservable = Observable.zip(bunObservable,
meatObservable,tomatoObservable,(bun, meat, tomato) -> makeBurger(bun, meat, tomato))
bunObservable
meatObservable
tomatoObservable
burgerObservable
27Consumer
Observable
Subscriber
.subscribe
28
Subscriber
burgerObservable.subscribe(mickeySubscriber);
29
Subscriber
onNext(Burger burger)
onCompleted()
burgerObservable.subscribe(
burger -> eatBurger(burger),error -> complain(error),() -> leaveBurgerJoint());
//onNext
//onError//onCompleted
onError(Throwable error)
30
Observable.zip(bunObservable, meatObservable,tomatoObservable,(bun, meat, tomato) ->
makeBurger(bun, meat, tomato)).subscribe(burger -> eatBurger(burger),
error -> complain(error)); //diningarea
//diningarea
31
//kitchen
//diningarea
Observable.zip(bunObservable, meatObservable,tomatoObservable,(bun, meat, tomato) ->
makeBurger(bun, meat, tomato)).subscribe(burger -> eatBurger(burger),
error -> complain(error));
32
//kitchen
//diningarea
Observable.zip(bunObservable, meatObservable,tomatoObservable,(bun, meat, tomato) ->
makeBurger(bun, meat, tomato)).subscribeOn(kitchen).observeOn(dining area).subscribe(burger -> eatBurger(burger),
error -> complain(error));
33
Observable.zip(bunObservable, meatObservable,tomatoObservable,(bun, meat, tomato) ->
makeBurger(bun, meat, tomato)).subscribeOn(Schedulers.computation()).observeOn(AndroidSchedulers.mainThread()).subscribe(burger -> eatBurger(burger),
error -> complain(error));//diningarea
//kitchen
34
Streamofdata
ObservableSubscriber
OperatorsThreads
35
Creating Observables
36
Creating Observables
From a List
37
List<Burger> burgers = new ArrayList<>();burgers.add(new Burger());burgers.add(new Burger());
Observable<Burger> burgerObservable = Observable.from(burgers);
38
List<Burger> burgers = new ArrayList<>();burgers.add(new Burger());burgers.add(new Burger());
Observable<Burger> burgerObservable = Observable.from(burgers);
1 2
39
Observable<Burger> burgerObservable = Observable.from(burgers);
burgerObservable.subscribe(new Subscriber<Burger>() {@Overridepublic void onNext(final Burger burger) {
} @Overridepublic void onCompleted() {
}@Overridepublic void onError(final Throwable e) {
}});
40
Observable<Burger> burgerObservable = Observable.from(burgers);
burgerObservable.subscribe(new Subscriber<Burger>() {@Overridepublic void onNext(final Burger burger) {
// handle burger 1}@Overridepublic void onCompleted() {
}@Overridepublic void onError(final Throwable e) {
}});
1
41
Observable<Burger> burgerObservable = Observable.from(burgers);
burgerObservable.subscribe(new Subscriber<Burger>() {@Overridepublic void onNext(final Burger burger) {
// handle burger 2}@Overridepublic void onCompleted() {
}@Overridepublic void onError(final Throwable e) {
}});
1 2
42
Observable<Burger> burgerObservable = Observable.from(burgers);
burgerObservable.subscribe(new Subscriber<Burger>() {@Overridepublic void onNext(final Burger burger) {
}@Overridepublic void onCompleted() {// no more burgers!
}@Overridepublic void onError(final Throwable e) {
}});
1 2
43
Observable<List<Burger>>
List<Burger> burgers = new ArrayList<>();burgers.add(new Burger());burgers.add(new Burger());
burgerObservable =Observable.just(burgers);
44
1
Observable<List<Burger>> burgerObservable =
Observable.just(burgers);
List<Burger> burgers = new ArrayList<>();burgers.add(new Burger());burgers.add(new Burger());
45
Observable<List<Burger>> burgerObservable = Observable.just(burgers);
burgerObservable.subscribe(new Subscriber<List<Burger>>() {
@Overridepublic void onNext(final List<Burger> burgers) {} @Overridepublic void onCompleted() {}@Overridepublic void onError(final Throwable e) {}
});
46
Observable<List<Burger>> burgerObservable = Observable.just(burgers);
burgerObservable.subscribe(new Subscriber<List<Burger>>() {@Overridepublic void onNext(
final List<Burger> burgers) {// handle the list of burgers
} @Overridepublic void onCompleted() {}@Overridepublic void onError(final Throwable e) {}
});
1
47
Observable<List<Burger>> burgerObservable = Observable.just(burgers);
burgerObservable.subscribe(new Subscriber<List<Burger>>() {
@Overridepublic void onNext(
final List<Burger> burgers) {// handle the list of burgers
} @Overridepublic void onCompleted() {// no more burgers!
}@Overridepublic void onError(final Throwable e) {
}});
1
48
Creating Observables
From Click Events
49
50
51
52
[click!] [click!] [click!]
53
???.subscribe(new Subscriber<String>() {
@Overridepublic void onNext(final String s) {
// called on every click}
@Overridepublic void onCompleted() {
}
@Overridepublic void onError(final Throwable e) {
}});
54
[click!] [click!] [click!]
???.onNext(…) ???.onNext(…) ???.onNext(…)
55
burgerButton.setOnClickListener(new View.OnClickListener() {
@Overridepublic void onClick(final View view) {
}});
PublishSubject<String> burgerRequestedSubject = PublishSubject.create();
56
burgerButton.setOnClickListener(new View.OnClickListener() {
@Overridepublic void onClick(final View view) {
burgerRequestedSubject.onNext(…);}
});
PublishSubject<String> burgerRequestedSubject = PublishSubject.create();
57
burgerRequestedSubject.subscribe(new Subscriber<String>() {
@Overridepublic void onNext(final String s) {
// called on every click}
@Overridepublic void onCompleted() {
// will never be called for click events}
@Overridepublic void onError(final Throwable e) {
}});
58
Creating Observables
From Declarative Code
59
public Burger cook(){// cooking is time consumingreturn burger;
}
Observable<Burger>burgerObservable =Observable.fromCallable(this::cook);
60
Error Handling
61
Thread t = new Thread(new Runnable() {@Overridepublic void run() {
cook();}
});
62
Thread t = new Thread(new Runnable() {@Overridepublic void run() {try{
cook();} catch(Exception e) {
// handle exception}}
});
63
getMeatObservable().filter(meat -> isMeatFresh(meat)).map(meat -> cook(meat)).subscribeOn(
meat -> doSomething(),error -> complain(error));
64
getMeatObservable().filter(meat -> isMeatFresh(meat)).map(meat -> cook(meat)).subscribeOn(
meat -> doSomething(),error -> complain(error));
65
public Observable<Meat> getCookedMeat() {return getMeatObservable()
.filter(meat -> isMeatFresh(meat))
.map(meat -> cook(meat));}
Observable.zip(getBun(),getCookedMeat(),getTomatoSlice(),(bun, meat, tomato) -> makeBurger(bun, meat, tomato))
.subscribeOn(burger -> eatBurger(burger),error -> complain(error));
66
public Observable<Meat> getCookedMeat() {return getMeatObservable()
.filter(meat -> isMeatFresh(meat))
.map(meat -> cook(meat));}
Observable.zip(getBun(),getCookedMeat(),getTomatoSlice(),(bun, meat, tomato) -> makeBurger(bun, meat, tomato))
.subscribeOn(burger -> eatBurger(burger),error -> complain(error));
67
Start using RxJava
68
public Burger cook(){// cooking is time consuming// make sure it’s on a background threadreturn burger;
}
Observable<Burger> burgerObservable = Observable.fromCallable(this::cook)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
69
@GET(“repos”) Call<List<Burger>> repoBurgers();
@GET(“repos”) Observable<List<Burger>> repoBurgers();
70
7171
The ABCs of RxJava
@FMuntenescu
Building a Reactive Mindsethttps://upday.github.io/blog/reactive_mindset_burgers
Reactive Burgers – Code Example https://github.com/florina-muntenescu/ReactiveBurgers