The ABCs of RxJava

71
1 1 The ABCs of RxJava Florina Muntenescu @FMuntenescu

Transcript of The ABCs of RxJava

Page 1: The ABCs of RxJava

11

The ABCs of RxJavaFlorinaMuntenescu@FMuntenescu

Page 2: The ABCs of RxJava

22

The ABCs of RxJavaMaking a BurgerFlorinaMuntenescu@FMuntenescu

Page 3: The ABCs of RxJava

3

Donald Duck’s Burger Joint

Page 4: The ABCs of RxJava

4

Huey Dewey Louie

Page 5: The ABCs of RxJava

5

Huey

Page 6: The ABCs of RxJava

6

Dewey

Page 7: The ABCs of RxJava

7

Louie

Page 8: The ABCs of RxJava

8

Huey

Dewey

Louie

Page 9: The ABCs of RxJava

9

filter(meat -> isMeatFresh(meat))

map(meat -> cook(meat))

Dewey

Page 10: The ABCs of RxJava

10

zip

Page 11: The ABCs of RxJava

11

zip

Page 12: The ABCs of RxJava

12

zip

Page 13: The ABCs of RxJava

13

zip

Page 14: The ABCs of RxJava

14

STREAMSOFDATA

Page 15: The ABCs of RxJava

15

STREAMSOFDATA

Page 16: The ABCs of RxJava

16

STREAMSOFDATA

Page 17: The ABCs of RxJava

17

zip

STREAMSOFDATA

Page 18: The ABCs of RxJava

18Consumer

Observable

Subscriber

Page 19: The ABCs of RxJava

19

filter(meat -> isMeatFresh(meat))

map(meat -> cook(meat))

operators

Page 20: The ABCs of RxJava

20

Huey.getBun()

Page 21: The ABCs of RxJava

21

filter(meat -> isMeatFresh(meat))

for(Meat meat: meatList){if(!isMeatFresh(meat)){

meatList.remove(meat);}

}

Page 22: The ABCs of RxJava

22

Observable.from(meatSource).filter(meat ->

isMeatFresh(meat))

filter(meat -> isMeatFresh(meat))

Page 23: The ABCs of RxJava

23

filter(meat -> isMeatFresh(meat))

map(meat -> cook(meat))

for(Meat meat: meatList){meat = cook(meat);

}

Page 24: The ABCs of RxJava

24

Observable.from(meatSource).filter(meat ->

isMeatGoneBad(meat)).map(meat -> cook(meat));

filter(meat -> isMeatFresh(meat))

map(meat -> cook(meat))

Page 25: The ABCs of RxJava

25

Observable<Burger> burgerObservable = Observable.zip(bunObservable,

meatObservable,tomatoObservable,(bun, meat, tomato) -> makeBurger(bun, meat, tomato))

bunObservable

meatObservable

tomatoObservable

burgerObservable

Page 26: The ABCs of RxJava

26

Observable<Burger> burgerObservable = Observable.zip(bunObservable,

meatObservable,tomatoObservable,(bun, meat, tomato) -> makeBurger(bun, meat, tomato))

bunObservable

meatObservable

tomatoObservable

burgerObservable

Page 27: The ABCs of RxJava

27Consumer

Observable

Subscriber

.subscribe

Page 28: The ABCs of RxJava

28

Subscriber

burgerObservable.subscribe(mickeySubscriber);

Page 29: The ABCs of RxJava

29

Subscriber

onNext(Burger burger)

onCompleted()

burgerObservable.subscribe(

burger -> eatBurger(burger),error -> complain(error),() -> leaveBurgerJoint());

//onNext

//onError//onCompleted

onError(Throwable error)

Page 30: The ABCs of RxJava

30

Observable.zip(bunObservable, meatObservable,tomatoObservable,(bun, meat, tomato) ->

makeBurger(bun, meat, tomato)).subscribe(burger -> eatBurger(burger),

error -> complain(error)); //diningarea

//diningarea

Page 31: The ABCs of RxJava

31

//kitchen

//diningarea

Observable.zip(bunObservable, meatObservable,tomatoObservable,(bun, meat, tomato) ->

makeBurger(bun, meat, tomato)).subscribe(burger -> eatBurger(burger),

error -> complain(error));

Page 32: The ABCs of RxJava

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));

Page 33: The ABCs of RxJava

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

Page 34: The ABCs of RxJava

34

Streamofdata

ObservableSubscriber

OperatorsThreads

Page 35: The ABCs of RxJava

35

Creating Observables

Page 36: The ABCs of RxJava

36

Creating Observables

From a List

Page 37: The ABCs of RxJava

37

List<Burger> burgers = new ArrayList<>();burgers.add(new Burger());burgers.add(new Burger());

Observable<Burger> burgerObservable = Observable.from(burgers);

Page 38: The ABCs of RxJava

38

List<Burger> burgers = new ArrayList<>();burgers.add(new Burger());burgers.add(new Burger());

Observable<Burger> burgerObservable = Observable.from(burgers);

1 2

Page 39: The ABCs of RxJava

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) {

}});

Page 40: The ABCs of RxJava

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

Page 41: The ABCs of RxJava

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

Page 42: The ABCs of RxJava

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

Page 43: The ABCs of RxJava

43

Observable<List<Burger>>

List<Burger> burgers = new ArrayList<>();burgers.add(new Burger());burgers.add(new Burger());

burgerObservable =Observable.just(burgers);

Page 44: The ABCs of RxJava

44

1

Observable<List<Burger>> burgerObservable =

Observable.just(burgers);

List<Burger> burgers = new ArrayList<>();burgers.add(new Burger());burgers.add(new Burger());

Page 45: The ABCs of RxJava

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) {}

});

Page 46: The ABCs of RxJava

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

Page 47: The ABCs of RxJava

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

Page 48: The ABCs of RxJava

48

Creating Observables

From Click Events

Page 49: The ABCs of RxJava

49

Page 50: The ABCs of RxJava

50

Page 51: The ABCs of RxJava

51

Page 52: The ABCs of RxJava

52

[click!] [click!] [click!]

Page 53: The ABCs of RxJava

53

???.subscribe(new Subscriber<String>() {

@Overridepublic void onNext(final String s) {

// called on every click}

@Overridepublic void onCompleted() {

}

@Overridepublic void onError(final Throwable e) {

}});

Page 54: The ABCs of RxJava

54

[click!] [click!] [click!]

???.onNext(…) ???.onNext(…) ???.onNext(…)

Page 55: The ABCs of RxJava

55

burgerButton.setOnClickListener(new View.OnClickListener() {

@Overridepublic void onClick(final View view) {

}});

PublishSubject<String> burgerRequestedSubject = PublishSubject.create();

Page 56: The ABCs of RxJava

56

burgerButton.setOnClickListener(new View.OnClickListener() {

@Overridepublic void onClick(final View view) {

burgerRequestedSubject.onNext(…);}

});

PublishSubject<String> burgerRequestedSubject = PublishSubject.create();

Page 57: The ABCs of RxJava

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) {

}});

Page 58: The ABCs of RxJava

58

Creating Observables

From Declarative Code

Page 59: The ABCs of RxJava

59

public Burger cook(){// cooking is time consumingreturn burger;

}

Observable<Burger>burgerObservable =Observable.fromCallable(this::cook);

Page 60: The ABCs of RxJava

60

Error Handling

Page 61: The ABCs of RxJava

61

Thread t = new Thread(new Runnable() {@Overridepublic void run() {

cook();}

});

Page 62: The ABCs of RxJava

62

Thread t = new Thread(new Runnable() {@Overridepublic void run() {try{

cook();} catch(Exception e) {

// handle exception}}

});

Page 63: The ABCs of RxJava

63

getMeatObservable().filter(meat -> isMeatFresh(meat)).map(meat -> cook(meat)).subscribeOn(

meat -> doSomething(),error -> complain(error));

Page 64: The ABCs of RxJava

64

getMeatObservable().filter(meat -> isMeatFresh(meat)).map(meat -> cook(meat)).subscribeOn(

meat -> doSomething(),error -> complain(error));

Page 65: The ABCs of RxJava

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));

Page 66: The ABCs of RxJava

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));

Page 67: The ABCs of RxJava

67

Start using RxJava

Page 68: The ABCs of 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())

Page 69: The ABCs of RxJava

69

@GET(“repos”) Call<List<Burger>> repoBurgers();

@GET(“repos”) Observable<List<Burger>> repoBurgers();

Page 70: The ABCs of RxJava

70

Page 71: The ABCs of RxJava

7171

The ABCs of RxJava

@FMuntenescu

[email protected]

Building a Reactive Mindsethttps://upday.github.io/blog/reactive_mindset_burgers

Reactive Burgers – Code Example https://github.com/florina-muntenescu/ReactiveBurgers