+ All Categories
Home > Mobile > The Next Step for Reactive Android Programming

The Next Step for Reactive Android Programming

Date post: 17-Feb-2017
Category:
Upload: tomasz-polanski
View: 369 times
Download: 1 times
Share this document with a friend
105
Reactive Android: The Next Steps Futurice & upday @tpolansk Tomek Polanski
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


Recommended