Building a reactive mindset

71
@FMuntenescu Florina Muntenescu @FMuntenescu Building a Reactive Mindset

Transcript of Building a reactive mindset

Page 1: Building a reactive mindset

@FMuntenescu

Florina Muntenescu@FMuntenescu

Building a Reactive Mindset

Page 2: Building a reactive mindset

@FMuntenescu

Florina Muntenescu@FMuntenescu

Building a Reactive Mindset

Page 3: Building a reactive mindset

@FMuntenescu

Donald

Duck’s Burger

Joint

Page 4: Building a reactive mindset

@FMuntenescu

Huey Dewey Louie

Page 5: Building a reactive mindset

@FMuntenescu

Huey

Page 6: Building a reactive mindset

@FMuntenescu

Dewey

Page 7: Building a reactive mindset

@FMuntenescu

Louie

Page 8: Building a reactive mindset

@FMuntenescu

Huey

Dewey

Louie

Page 9: Building a reactive mindset

@FMuntenescu

filter(meat -> isMeatFresh(meat))

map(meat -> cook(meat))

Dewey

Page 10: Building a reactive mindset

@FMuntenescu

zip

Page 11: Building a reactive mindset

@FMuntenescu

zip

Page 12: Building a reactive mindset

@FMuntenescu

zip

Page 13: Building a reactive mindset

@FMuntenescu

zip

Page 14: Building a reactive mindset

@FMuntenescuSTREAMS OF DATA

Page 15: Building a reactive mindset

@FMuntenescuSTREAMS OF DATA

Page 16: Building a reactive mindset

@FMuntenescuSTREAMS OF DATA

Page 17: Building a reactive mindset

@FMuntenescu

zip

STREAMS OF DATA

Page 18: Building a reactive mindset

@FMuntenescu

Consumer

Observable

Subscriber

Page 19: Building a reactive mindset

@FMuntenescu

filter(meat -> isMeatFresh(meat))

map(meat -> cook(meat))

operators

Page 20: Building a reactive mindset

@FMuntenescu

Huey.getBun()

Page 21: Building a reactive mindset

@FMuntenescu

filter(meat -> isMeatFresh(meat))

for(Meat meat: meatList){

if(!isMeatFresh(meat)){

meatList.remove(meat);

}

}

Page 22: Building a reactive mindset

@FMuntenescu

Observable.from(meatSource)

.filter(meat ->

isMeatFresh(meat))

filter(meat -> isMeatFresh(meat))

Page 23: Building a reactive mindset

@FMuntenescu

filter(meat -> isMeatFresh(meat))

map(meat -> cook(meat))

for(Meat meat: meatList){

meat = cook(meat);

}

Page 24: Building a reactive mindset

@FMuntenescu

Observable.from(meatSource)

.filter(meat ->

isMeatGoneBad(meat))

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

filter(meat -> isMeatFresh(meat))

map(meat -> cook(meat))

Page 25: Building a reactive mindset

@FMuntenescu

Observable<Burger> burgerObservable =

Observable.zip(bunObservable,

meatObservable,

tomatoObservable,

(bun, meat, tomato) ->

makeBurger(bun, meat, tomato))

bunObservable

meatObservable

tomatoObservable

burgerObservable

Page 26: Building a reactive mindset

@FMuntenescu

Observable<Burger> burgerObservable =

Observable.zip(bunObservable,

meatObservable,

tomatoObservable,

(bun, meat, tomato) ->

makeBurger(bun, meat, tomato))

bunObservable

meatObservable

tomatoObservable

burgerObservable

Page 27: Building a reactive mindset

@FMuntenescuConsumer

Observable

Subscriber

.subscribe

Page 28: Building a reactive mindset

@FMuntenescu

Subscriber

burgerObservable

.subscribe(mickeySubscriber);

Page 29: Building a reactive mindset

@FMuntenescu

Subscriber

onNext(Burger burger)

onCompleted()

burgerObservable

.subscribe(

burger -> eatBurger(burger),

error -> complain(error),

() -> leaveBurgerJoint());

// onNext

//onError

//onCompleted

onError(Throwable error)

Page 30: Building a reactive mindset

@FMuntenescu

Observable.zip(bunObservable,

meatObservable,

tomatoObservable,

(bun, meat, tomato) ->

makeBurger(bun, meat, tomato))

.subscribe(burger -> eatBurger(burger),

error -> complain(error));

// dining area

// dining area

Page 31: Building a reactive mindset

@FMuntenescu

// kitchen

Observable.zip(bunObservable,

meatObservable,

tomatoObservable,

(bun, meat, tomato) ->

makeBurger(bun, meat, tomato))

.subscribe(burger -> eatBurger(burger),

error -> complain(error));

// dining area

Page 32: Building a reactive mindset

@FMuntenescu

// kitchen

// dining area

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: Building a reactive mindset

@FMuntenescu

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

// kitchen

// dining area

Page 34: Building a reactive mindset

@FMuntenescu

Stream of data

ObservableSubscriber

OperatorsThreads

Page 35: Building a reactive mindset

@FMuntenescu

Creating

Observables

Page 36: Building a reactive mindset

@FMuntenescu

Creating

Observables

From a

List

Page 37: Building a reactive mindset

@FMuntenescu

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

burgers.add(new Burger());

burgers.add(new Burger());

Observable<Burger> burgerObservable =

Observable.from(burgers);

Page 38: Building a reactive mindset

@FMuntenescu

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

burgers.add(new Burger());

burgers.add(new Burger());

Observable<Burger> burgerObservable =

Observable.from(burgers);

1 2

Page 39: Building a reactive mindset

@FMuntenescu

Observable<Burger> burgerObservable =

Observable.from(burgers);

burgerObservable.subscribe(new Subscriber<Burger>() {

@Override

public void onNext(final Burger burger) {

}

@Override

public void onCompleted() {

}

@Override

public void onError(final Throwable e) {

}

});

Page 40: Building a reactive mindset

@FMuntenescu

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

burgerObservable.subscribe(new Subscriber<Burger>() {

@Override

public void onNext(final Burger burger) {

// handle burger 1

}@Override

public void onCompleted() {

}

@Override

public void onError(final Throwable e) {

}

});

1

Page 41: Building a reactive mindset

@FMuntenescu

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

burgerObservable.subscribe(new Subscriber<Burger>() {

@Override

public void onNext(final Burger burger) {

// handle burger 2

}@Override

public void onCompleted() {

}

@Override

public void onError(final Throwable e) {

}

});

1 2

Page 42: Building a reactive mindset

@FMuntenescu

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

burgerObservable.subscribe(new Subscriber<Burger>() {

@Override

public void onNext(final Burger burger) {

}

@Override

public void onCompleted() {

// no more burgers!

}@Override

public void onError(final Throwable e) {

}

});

1 2

Page 43: Building a reactive mindset

@FMuntenescu

Observable<List<Burger>>

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

burgers.add(new Burger());

burgers.add(new Burger());

burgerObservable =

Observable.just(burgers);

Page 44: Building a reactive mindset

@FMuntenescu

1

Observable<List<Burger>> burgerObservable

=

Observable.just(burgers);

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

burgers.add(new Burger());

burgers.add(new Burger());

Page 45: Building a reactive mindset

@FMuntenescu

Observable<List<Burger>> burgerObservable =

Observable.just(burgers);

burgerObservable.subscribe(

new Subscriber<List<Burger>>() {

@Override

public void onNext(final List<Burger> burgers) {

}

@Override

public void onCompleted() {

}

@Override

public void onError(final Throwable e) {

}

});

Page 46: Building a reactive mindset

@FMuntenescu

Observable<List<Burger>> burgerObservable =

Observable.just(burgers);

burgerObservable.subscribe(

new Subscriber<List<Burger>>() {

@Override

public void onNext(

final List<Burger> burgers) {

// handle the list of burgers

} @Override

public void onCompleted() {

}

@Override

public void onError(final Throwable e) {

}

});

1

Page 47: Building a reactive mindset

@FMuntenescu

Observable<List<Burger>> burgerObservable =

Observable.just(burgers);

burgerObservable.subscribe(

new Subscriber<List<Burger>>() {

@Override

public void onNext(

final List<Burger> burgers) {

// handle the list of burgers

}

@Override

public void onCompleted() {

// no more burgers!

}@Override

public void onError(final Throwable e) {

}

});

1

Page 48: Building a reactive mindset

@FMuntenescu

Creating

Observables

From

Click

Events

Page 49: Building a reactive mindset

@FMuntenescu

Page 50: Building a reactive mindset

@FMuntenescu

Page 51: Building a reactive mindset

@FMuntenescu

Page 52: Building a reactive mindset

@FMuntenescu

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

Page 53: Building a reactive mindset

@FMuntenescu

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

@Override

public void onNext(final String s) {

// called on every click

}

@Override

public void onCompleted() {

}

@Override

public void onError(final Throwable e) {

}

});

Page 54: Building a reactive mindset

@FMuntenescu

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

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

Page 55: Building a reactive mindset

@FMuntenescu

burgerButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(final View view) {

}

});

PublishSubject<String> burgerRequestedSubject =

PublishSubject.create();

Page 56: Building a reactive mindset

@FMuntenescu

burgerButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(final View view) {

burgerRequestedSubject.onNext(…);}

});

PublishSubject<String> burgerRequestedSubject =

PublishSubject.create();

Page 57: Building a reactive mindset

@FMuntenescu

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

@Override

public void onNext(final String s) {

// called on every click

}

@Override

public void onCompleted() {

// will never be called for click events

}

@Override

public void onError(final Throwable e) {

}

});

Page 58: Building a reactive mindset

@FMuntenescu

Creating

Observables

From

Declarativ

e Code

Page 59: Building a reactive mindset

@FMuntenescu

public Burger cook(){

// cooking is time consuming

return burger;

}

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

Page 60: Building a reactive mindset

@FMuntenescu

Error

Handling

Page 61: Building a reactive mindset

@FMuntenescu

Thread t = new Thread(new Runnable() {

@Override

public void run() {

cook();

}

});

Page 62: Building a reactive mindset

@FMuntenescu

Thread t = new Thread(new Runnable() {

@Override

public void run() {

try{

cook();

} catch(Exception e) {

// handle exception

}

}

});

Page 63: Building a reactive mindset

@FMuntenescu

getMeatObservable()

.filter(meat -> isMeatFresh(meat))

.map(meat -> cook(meat))

.subscribeOn(

meat -> doSomething(),

error -> complain(error));

Page 64: Building a reactive mindset

@FMuntenescu

getMeatObservable()

.filter(meat -> isMeatFresh(meat))

.map(meat -> cook(meat))

.subscribeOn(

meat -> doSomething(),

error -> complain(error));

Page 65: Building a reactive mindset

@FMuntenescu

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: Building a reactive mindset

@FMuntenescu

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: Building a reactive mindset

@FMuntenescu

Start using

RxJava

Page 68: Building a reactive mindset

@FMuntenescu

public Burger cook(){

// cooking is time consuming

// make sure it’s on a background thread

return burger;

}

Observable<Burger> burgerObservable =

Observable.fromCallable(this::cook)

.subscribeOn(Schedulers.computation())

.observeOn(AndroidSchedulers.mainThread())

Page 69: Building a reactive mindset

@FMuntenescu

@GET(“repos”)

Call<List<Burger>> repoBurgers();

@GET(“repos”)

Observable<List<Burger>> repoBurgers();

Page 70: Building a reactive mindset

@FMuntenescu

Page 71: Building a reactive mindset

@FMuntenescu@FMuntenescu

[email protected]

Building a Reactive Mindset

https://upday.github.io/blog/reactive_mindset_burgers

Reactive Burgers – Code Example

https://github.com/florina-muntenescu/ReactiveBurgers

Building a BurgerReactive Mindset