The ABCs of RxJava

Post on 16-Apr-2017

513 views 0 download

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

jobs@upday.com

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

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