Reactive Frustrations

Preview:

Citation preview

Reactive Frustrations

Futurice & upday

@tpolansk

Tomek Polanski

The Stages of Rx

@tpolansk

The Amazement

@tpolansk

0 – 4 months

The Frustration

@tpolansk

4 months – 1 year

Cautious Optimism

@tpolansk

1 year – 3+ years

Anonymous class

@tpolansk

button.setListener( new OnClickListener() {

@Overridepublic void onClick(View v) {

println(“Hi”); }});

@tpolansk

button.setListener(v -> println(“Hi”));

@tpolansk

Forgetting to subscribe

@tpolansk

just(“Will this work?”) .doOnNext(text -> println(text)) .subscribe(…)

@tpolansk

How Do Observables

Behave?@tpolansk

combineLatest(first, second, (f, s) -> f + s) .doOnNext(value -> println(value))

@tpolansk

first second

println(value) .…

concat(first, second) .doOnNext(value -> println(value))

@tpolansk

first second println(value)

Observable<…> getValue()Observable<…> getValueOnce()

Observable<…> getValueStream()

Observable<…> getValueOnceAndStream()

@tpolansk

combineLatest(firstOnce, secondOnceAndStream, (f, s) -> f + s) .doOnNext(value -> println(value))

@tpolansk

firstOnce secondOnceAndStream

concat(firstOnce, secondStream) .doOnNext(value -> println(value))

@tpolansk

firstOnce secondStream

Too Many Events

@tpolansk

Observable<R> x(Func1<T, Observable<R>> func)

@tpolansk

Func1< > func

TObservable<R> Observable<R>

flatMap, switchMap and concatMapflatMap switchMap concatMap

Crashing Errors

@tpolansk

getCountStream() .subscribe(count -> println(count)

@tpolansk

) , error -> println(error))

Costly subscribe

@tpolansk

@tpolansk

create(subscriber -> subscriber.onNext(1)) .map(val -> val + 1) .filter(val -> val % 2 == 0)

create map filter

subscriber -> subscriber.onNext(1) val -> val + 1 val -> val % 2 == 0 .subscribe(val -> println(val))

just(blockingFunc())

@tpolansk

fromCallable(() -> blockingFunc())

just blockingFunc()

fromCallable () -> blockingFunc()

Observable<…> obs = fromCallable(() -> expensiveFunc())

@tpolansk

expensiveFunc()

obs.subscribe(…)obs.subscribe(…)

1x2x

Wrong Threads

@tpolansk

@tpolansk

create(subscriber -> subscriber.onNext(1)) subscriber -> subscriber.onNext(1) .subscribeOn(…) .subscribeOn(…) .observeOn(…) .map(val -> val + 1)

Confusing zip

@tpolansk

Side-effects withdebounce

@tpolansk

Leaking Subscriptions

@tpolansk

Subscription s = getCountStream() .subscribe(…)

@tpolansk

subscribeSubscription s

s

s.unsubscribe()

Logging Wrong Events

@tpolansk

getCountStream()

@tpolansk

.doOnNext(count -> println(count)) .doOnNext(count -> println(count)) .doOnEach(notify -> println(notify))

The Conclusion

@tpolansk

No More Thread Synchronization

+Transforming Async Events

@tpolansk

Can Make Application Truly Reactive

@tpolansk

Rx Is Just a Tool

@tpolansk

Don’t Be Dogmatic

@tpolansk

Questions, Feedback &

Frustrations@tpolansk

Recommended