Top Banner
Reactive Android: The Next Steps Futurice & upday @tpolansk Tomek Polanski
105

The Next Step for Reactive Android Programming

Feb 17, 2017

Download

Mobile

Tomasz Polanski
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: The Next Step for Reactive Android Programming

Reactive Android:The Next Steps

Futurice & upday

@tpolansk

Tomek Polanski

Page 2: The Next Step for Reactive Android Programming

The Good

@tpolansk

Page 3: The Next Step for Reactive Android Programming

Reactive Streamscompatibility

@tpolansk[1]

Page 4: The Next Step for Reactive Android Programming

4 interfaces 7 methods

@tpolansk

Page 5: The Next Step for Reactive Android Programming

Flowable.just("- I'm RxJava!")

@tpolansk

Page 6: The Next Step for Reactive Android Programming

Flowable.just("- I'm RxJava!")

@tpolansk

RxJava 2

Page 7: The Next Step for Reactive Android Programming

Flux.from(Flowable.just("- I'm RxJava!"))

@tpolansk

RxJava 2

Page 8: The Next Step for Reactive Android Programming

Flux.from(Flowable.just("- I'm RxJava!"))

@tpolansk

RxJava 2

Reactor 3

Page 9: The Next Step for Reactive Android Programming

Flux.from(Flowable.just("- I'm RxJava!")) .map(msg -> msg + " - I'm Reactor!")

@tpolansk

RxJava 2

Page 10: The Next Step for Reactive Android Programming

Flux.from(Flowable.just("- I'm RxJava!")) .map(msg -> msg + " - I'm Reactor!")

@tpolansk

Reactor 3

RxJava 2

Page 11: The Next Step for Reactive Android Programming

Flux.from(Flowable.just("- I'm RxJava!")) .map(msg -> msg + " - I'm Reactor!") .subscribe(msg -> print(msg));

@tpolansk

RxJava 2

Page 12: The Next Step for Reactive Android Programming

Flux.from(Flowable.just("- I'm RxJava!")) .map(msg -> msg + " - I'm Reactor!") .subscribe(msg -> print(msg));

@tpolansk

RxJava 2

Reactor 3

[2]

Page 13: The Next Step for Reactive Android Programming

Backpressure

@tpolansk

Page 14: The Next Step for Reactive Android Programming

Backpressure

Flowable&

Observable@tpolansk

Page 15: The Next Step for Reactive Android Programming

Flowable:BUFFER, DROP,…

@tpolansk

Page 16: The Next Step for Reactive Android Programming

Observable:Buffer-like

@tpolansk

Page 17: The Next Step for Reactive Android Programming

Observable:Buffer-like

@tpolansk

Out Of Memory

Page 18: The Next Step for Reactive Android Programming

Flowable?

@tpolansk

Page 19: The Next Step for Reactive Android Programming

@tpolansk

Page 20: The Next Step for Reactive Android Programming

Flowable

Exception Is Really Likely

@tpolansk

Page 21: The Next Step for Reactive Android Programming

Observable

Exception Is Not Likely

@tpolansk

Page 22: The Next Step for Reactive Android Programming

Better Single and Completable

Integration @tpolansk

Page 23: The Next Step for Reactive Android Programming

Observable.range(0, 10) .all(it -> it % 2 == 0)

@tpolansk

Page 24: The Next Step for Reactive Android Programming

Observable.range(0, 10) .all(it -> it % 2 == 0)

@tpolansk

RxJava 1 - Observable

Page 25: The Next Step for Reactive Android Programming

@tpolansk

RxJava 2 - Single

Observable.range(0, 10) .all(it -> it % 2 == 0)

Page 26: The Next Step for Reactive Android Programming

Performance

@tpolansk[3]

Page 27: The Next Step for Reactive Android Programming

Performance

(-76%, +2800%)

@tpolansk[3]

Page 28: The Next Step for Reactive Android Programming

Memory

@tpolansk[3]

Page 29: The Next Step for Reactive Android Programming

Memory

50% less

@tpolansk[3]

Page 30: The Next Step for Reactive Android Programming

Testing

@tpolansk

Page 31: The Next Step for Reactive Android Programming

Testing

.test()

@tpolansk

Page 32: The Next Step for Reactive Android Programming

Observable.just(1)

@tpolansk

Page 33: The Next Step for Reactive Android Programming

Observable.just(1) .test()

@tpolansk

Page 34: The Next Step for Reactive Android Programming

Observable.just(1) .test() .assertValue(1)

@tpolansk

Page 35: The Next Step for Reactive Android Programming

Observable.just(1) .test() .assertValue(1) .assertComplete();

@tpolansk

Page 36: The Next Step for Reactive Android Programming

Observable.just(1) .test() .assertValue(1) .assertComplete();

@tpolansk

Soon in RxJava 1

[4]

Page 37: The Next Step for Reactive Android Programming

Bye Bye nulls

@tpolansk

“1B$ Mistake” no more

[5]

Page 38: The Next Step for Reactive Android Programming

The Bad

@tpolansk

Page 39: The Next Step for Reactive Android Programming

Bye Bye nulls

@tpolansk

Removing takes time

Page 40: The Next Step for Reactive Android Programming

Writing Operators

@tpolansk

Page 41: The Next Step for Reactive Android Programming

10x HARDER*

@tpolansk[6]

Page 42: The Next Step for Reactive Android Programming

10x HARDER*

@tpolansk

Page 43: The Next Step for Reactive Android Programming

Android Dev’s Nightmare

@tpolansk

Page 44: The Next Step for Reactive Android Programming

AsyncTask?

@tpolansk

Page 45: The Next Step for Reactive Android Programming

AsyncTask?

@tpolansk

Configuration Change?

Page 46: The Next Step for Reactive Android Programming

AsyncTask?

@tpolansk

Styling? Configuration Change?

Page 47: The Next Step for Reactive Android Programming

AsyncTask?

@tpolansk

Styling? Bluetooth LE?

Configuration Change?

Page 48: The Next Step for Reactive Android Programming

AsyncTask?

@tpolansk

Styling? Java 7 Forever?Bluetooth LE?

Configuration Change?

Page 49: The Next Step for Reactive Android Programming

Dex Limit

@tpolansk

Page 50: The Next Step for Reactive Android Programming

RxJava 1.2.2

5600 @tpolansk

Page 51: The Next Step for Reactive Android Programming

RxJava 2.0.1

9200 @tpolansk

Page 52: The Next Step for Reactive Android Programming

5600 + 9200 = 14800

@tpolansk

Page 53: The Next Step for Reactive Android Programming

5600 + 9200 = 14800

22% Dex Limit @tpolansk

Page 54: The Next Step for Reactive Android Programming

The Migration

@tpolansk

Page 55: The Next Step for Reactive Android Programming

upday’s RxJava integration

@tpolansk

Page 56: The Next Step for Reactive Android Programming

Observable: 1224

@tpolansk

Page 57: The Next Step for Reactive Android Programming

Observable: 1224

@tpolansk

Page 58: The Next Step for Reactive Android Programming

Observable: 1224int: 1516

@tpolansk

Page 59: The Next Step for Reactive Android Programming

Observable: 1224int: 1516

@tpolansk

Page 60: The Next Step for Reactive Android Programming

Observable: 1224int: 1516

String: 3246@tpolansk

Page 61: The Next Step for Reactive Android Programming

Observable: 1224int: 1516

String: 3246@tpolansk

Page 62: The Next Step for Reactive Android Programming

Not in One Go!

@tpolansk

Page 63: The Next Step for Reactive Android Programming

Update toThe Newest

RxJava 1.x.x@tpolansk[7]

Page 64: The Next Step for Reactive Android Programming

Use

RxJava2Interop@tpolansk[8]

Page 65: The Next Step for Reactive Android Programming

The Data Flow

@tpolansk

Page 66: The Next Step for Reactive Android Programming

@tpolansk

Network

UI

Page 67: The Next Step for Reactive Android Programming

@tpolansk

Network

UI

Page 68: The Next Step for Reactive Android Programming

@tpolansk

Network

UI

Page 69: The Next Step for Reactive Android Programming

Start With Leafs

Not Roots

@tpolansk

Page 70: The Next Step for Reactive Android Programming

// Activity

dataModel.getText() .subscribe(text -> view.setText(text));

@tpolansk

Page 71: The Next Step for Reactive Android Programming

// Activity

dataModel.getText() .subscribe(text -> view.setText(text));

@tpolansk

RxJava 1

Page 72: The Next Step for Reactive Android Programming

// Activity

RxJavaInterop .toV2Observable(dataModel.getText()) .subscribe(text -> view.setText(text));

@tpolansk

Page 73: The Next Step for Reactive Android Programming

// Activity

RxJavaInterop .toV2Observable(dataModel.getText()) .subscribe(text -> view.setText(text));

@tpolansk

RxJava 1

Page 74: The Next Step for Reactive Android Programming

// Activity

RxJavaInterop .toV2Observable(dataModel.getText()) .subscribe(text -> view.setText(text));

@tpolansk

RxJava 1

RxJava 2

Page 75: The Next Step for Reactive Android Programming

// DataModel

Observable<String> getText() { return cache.getText();}

@tpolansk

Page 76: The Next Step for Reactive Android Programming

// DataModel

Observable<String> getText() { return cache.getText();}

@tpolansk

RxJava 1

Page 77: The Next Step for Reactive Android Programming

// DataModel

Observable<String> getText() { return RxJavaInterop .toV2Observable(cache.getText());}

@tpolansk

Page 78: The Next Step for Reactive Android Programming

// DataModel

Observable<String> getText() { return RxJavaInterop .toV2Observable(cache.getText());}

@tpolansk

RxJava 2

Page 79: The Next Step for Reactive Android Programming

// Activity

RxJavaInterop .toV2Observable(dataModel.getText()) .subscribe(text -> view.setText(text));

@tpolansk

RxJava 2

Page 80: The Next Step for Reactive Android Programming

// Activity

dataModel.getText() .subscribe(text -> view.setText(text));

@tpolansk

RxJava 2

Page 81: The Next Step for Reactive Android Programming

Replacing nulls

@tpolansk

Page 82: The Next Step for Reactive Android Programming

Replacing nulls

Null Objects or

Optionals@tpolansk[9]

Page 83: The Next Step for Reactive Android Programming

class User {String name;

User(String name) {this.name = name;

}}

@tpolansk

Page 84: The Next Step for Reactive Android Programming

Observable<User> userStream = …

@tpolansk

Page 85: The Next Step for Reactive Android Programming

Observable<User> userStream = ……userStream .filter(user -> user != null)

@tpolansk

Page 86: The Next Step for Reactive Android Programming

class User {static final User EMPTY = new

User(“”);

String name;

public User(String name) {this.name = name;

}}

@tpolansk

Page 87: The Next Step for Reactive Android Programming

Observable<User> userStream = ……userStream .filter(user -> !user.equals(User.EMPTY))

@tpolansk

Page 88: The Next Step for Reactive Android Programming

The Frustrating

@tpolansk

Page 89: The Next Step for Reactive Android Programming

NoSuchMethodError

@tpolansk

Page 90: The Next Step for Reactive Android Programming

NoSuchMethodError

@tpolansk

Wait for libs update!

Page 91: The Next Step for Reactive Android Programming

@tpolansk

First element?

Page 92: The Next Step for Reactive Android Programming

@tpolansk

.first(…).firstOrError()

.singleElement()

.single(…)

.singleOrError()

.firstElement()

Page 93: The Next Step for Reactive Android Programming

@tpolansk

.first(…).firstOrError()

.singleElement()

.single(…)

.singleOrError()

.firstElement()

?

Page 94: The Next Step for Reactive Android Programming

@tpolansk

Relearn some operators

!

Page 95: The Next Step for Reactive Android Programming

Migrating Tests

@tpolansk

Page 96: The Next Step for Reactive Android Programming

TestSubscriber<Integer> ts = new TestSubscriber<>();

Observable.just(1).subscribe(ts);

ts.assertValue(1);

@tpolansk

Page 97: The Next Step for Reactive Android Programming

TestSubscriber<Integer> ts = new TestSubscriber<>();

Observable.just(1).subscribe(ts);

ts.assertValue(1);

@tpolansk

Page 98: The Next Step for Reactive Android Programming

TestObserver<Integer> to = new TestObserver<>();

Observable.just(1).subscribe(to);

to.assertValue(1);

@tpolansk

Page 99: The Next Step for Reactive Android Programming

Observable.just(1) .test() .assertValue(1);

@tpolansk

Page 100: The Next Step for Reactive Android Programming

Conclusion

@tpolansk

Page 101: The Next Step for Reactive Android Programming

RxJava 2 Is Better!

@tpolansk

Page 102: The Next Step for Reactive Android Programming

New Project?

Definitely RxJava 2

@tpolansk

Page 103: The Next Step for Reactive Android Programming

Almost Done Project?

Should Not Migrate

@tpolansk

Page 104: The Next Step for Reactive Android Programming

Anything Between?

It’s Always Up to You

@tpolansk

Page 105: The Next Step for Reactive Android Programming

@tpolansk

[1] Reactive Streams – https://github.com/reactive-streams/reactive-streams-jvm[2] Reactor 3 - https://github.com/reactor/reactor-core[3] RxJava 2 Benchmark - https://github.com/akarnokd/akarnokd-misc/issues/2[4] test() operator in v1 - https://github.com/ReactiveX/RxJava/pull/4777[5] The Billion Dollar Mistake - https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare [6] Writing Operators - https://github.com/ReactiveX/RxJava/wiki/Writing-operators-for-2.0[7] RxJava releases - https://github.com/ReactiveX/RxJava/releases[8] RxJava2Interop - https://github.com/akarnokd/RxJava2Interop[9] Simple Options - https://github.com/tomaszpolanski/Options