Slide 1

Slide 1 text

#DroidConBos @ragdroid `Rxify` Presented By : Garima Jain @ragdroid A simple spell for complex RxJava operators

Slide 2

Slide 2 text

Who?

Slide 3

Slide 3 text

#DroidConBos @ragdroid `Rxify` is for? • Already working on RxJava - More to learn.

Slide 4

Slide 4 text

#DroidConBos @ragdroid `Rxify` is for? • Already working on RxJava - More to learn. • Beginner - Time to start Rxifying your apps

Slide 5

Slide 5 text

#DroidConBos @ragdroid `Rxify` is for? • Already working on RxJava - More to learn. • Beginner - Time to start Rxifying your apps • Pros - Talk will be fun!

Slide 6

Slide 6 text

#DroidConBos @ragdroid `Rxify` is for? • Already working on RxJava - More to learn. • Beginner - Time to start Rxifying your apps • Pros - Talk will be fun! • Not Interested?

Slide 7

Slide 7 text

#DroidConBos @ragdroid `Rxify` is for?

Slide 8

Slide 8 text

What?

Slide 9

Slide 9 text

#DroidConBos @ragdroid • `Rxify` - term signifies use of RxJava • RxJava makes our lives simpler. • Cast a spell (use an operator) and we are good to go. `Rxify`

Slide 10

Slide 10 text

#DroidConBos @ragdroid • Reactive Extensions for JVM (Java Virtual Machine). • Observer pattern for sequences of data / events. RxJava

Slide 11

Slide 11 text

#DroidConBos @ragdroid RxJava makes lives simpler • Never having to worry about : • Low-level Threading • Synchronisation • Background Processing

Slide 12

Slide 12 text

Why?

Slide 13

Slide 13 text

#DroidConBos @ragdroid RxJava operators at first glance

Slide 14

Slide 14 text

#DroidConBos @ragdroid RxJava operators at first glance

Slide 15

Slide 15 text

#DroidConBos @ragdroid RxJava operators at first glance • Complex • Hard to understand • Marble Diagrams? What!!

Slide 16

Slide 16 text

“The Plan”

Slide 17

Slide 17 text

The Plan • Basics • Spells • Complex Spells • Thread Travel

Slide 18

Slide 18 text

The Plan • Basics • Spells ✦ map() ✦ flatmap() ✦ filter() • Complex Spells • Thread Travel

Slide 19

Slide 19 text

The Plan • Basics • Spells • Complex Spells ✦ zip() ✦ concat() vs merge() ✦ buffer() ✦ debounce() ✦ flatmap() vs concatMap() vs switchMap() • Thread Travel

Slide 20

Slide 20 text

The Plan • Basics • Spells • Complex Spells • Thread Travel ✦ subscribeOn() ✦ observeOn()

Slide 21

Slide 21 text

Basics

Slide 22

Slide 22 text

#DroidConBos @ragdroid • Observable produces items, • Subscriber consumes those items. • Observable calls : (Actions) • onNext() multiple times • followed by onComplete() • OR onError() Basics

Slide 23

Slide 23 text

#DroidConBos @ragdroid • Operators : • manipulate items between producer and consumer. • Schedulers • Main Thread • Computation, IO (Background Thread) • Test Scheduler Basics

Slide 24

Slide 24 text

#DroidConBos @ragdroid Observable Pattern Producer Consumer A B C items Observable emits Subscriber consumes

Slide 25

Slide 25 text

#DroidConBos @ragdroid Just-ify Simple Observable String Hello World! Observable.just("Hello World!”); Observable time Hello World

Slide 26

Slide 26 text

#DroidConBos @ragdroid A B C A B C Rx-ify String Array Simple Observable List source = Arrays.asList("A", "B", "C");
 Observable.fromIterable(source); Observable

Slide 27

Slide 27 text

“Spells” operators

Slide 28

Slide 28 text

“Map-io” map() operator

Slide 29

Slide 29 text

#DroidConBos @ragdroid Map Transforms every element of a collection of items.

Slide 30

Slide 30 text

#DroidConBos @ragdroid Map-io Observable Map Observable 1 2 3 10 20 30

Slide 31

Slide 31 text

#DroidConBos @ragdroid Observable Map Observable.fromIterable(Arrays.asList(1, 2, 3))
 .map(integer -> integer * 10); Observable 1 2 3 10 20 30

Slide 32

Slide 32 text

“FlatMap-um” flatMap() operator

Slide 33

Slide 33 text

#DroidConBos @ragdroid FlatMap • Every element of a collection • To another collection of items • Combines them into a single collection.

Slide 34

Slide 34 text

#DroidConBos @ragdroid FlatMap-um Observable FlatMap Observable Hello World How Are You? Hello World How Are You?

Slide 35

Slide 35 text

#DroidConBos @ragdroid Observable FlatMap List source = Arrays.asList("Hello World", "How Are You");
 Observable.fromIterable(source)
 .flatMap(s -> Observable.fromIterable(
 Arrays.asList(s.split(" ")))); Observable Hello World How Are You? Hello World How Are You?

Slide 36

Slide 36 text

“Filter-rum” filter() operator

Slide 37

Slide 37 text

#DroidConBos @ragdroid Filter Filter the original collection to emit items that satisfy a condition.

Slide 38

Slide 38 text

#DroidConBos @ragdroid Filter-rum Observable Filter Observable 1 2 3 1 4 5 6 3 5 7 7

Slide 39

Slide 39 text

#DroidConBos @ragdroid Observable Filter Observable 1 2 3 1 4 5 6 3 5 getSourceObservable() .filter(integer -> integer % 2 == 1) 7 7

Slide 40

Slide 40 text

“Comples spells” complex operators

Slide 41

Slide 41 text

“Zip-pyosa” zip() operator

Slide 42

Slide 42 text

#DroidConBos @ragdroid Zip • Combine multiple collections together • According to some function • Emit the result of each combination.

Slide 43

Slide 43 text

#DroidConBos @ragdroid Zip Marble Diagram

Slide 44

Slide 44 text

#DroidConBos @ragdroid Zip Marble Diagram Looks a little Overwhelming

Slide 45

Slide 45 text

#DroidConBos @ragdroid Zip Marble Diagram Looks a little Overwhelming

Slide 46

Slide 46 text

#DroidConBos @ragdroid Fictional Problem (Polyjuice Potion) • Hermione wants to prepare Polyjuice potion (P = R + H). * • She is waiting for task Ron (R) to bring FluxWeed. • She is waiting for task Harry (H) to bring hair. • Both tasks R and H are executing asynchronously. • Only after both R and H are completed then P can start. * ‘+’ is some complex function (brewing the Polyjuice in this case)

Slide 47

Slide 47 text

#DroidConBos @ragdroid Zip-Yosa Observable Zip Observable FluxWeed CrabHair Polyjuice Potion Observable

Slide 48

Slide 48 text

#DroidConBos @ragdroid Observable Zip Observable FluxWeed CrabHair Polyjuice Potion Observable 
 return Observable.zip( fluxWeedObservable, hairObservable,
 (fluxWeed, student) -> new PolyJuice(fluxWeed, student.getHair()) .prepare()) );

Slide 49

Slide 49 text

#DroidConBos @ragdroid Observable Zip Observable FluxWeed CrabHair Polyjuice Potion Observable 
 return Observable.zip( fluxWeedObservable, hairObservable,
 (fluxWeed, student) -> new PolyJuice(fluxWeed, student.getHair()) .prepare()) );

Slide 50

Slide 50 text

#DroidConBos @ragdroid Observable Zip Observable FluxWeed CrabHair Polyjuice Potion Observable 
 return Observable.zip( fluxWeedObservable, hairObservable,
 (fluxWeed, student) -> new PolyJuice(fluxWeed, student.getHair()) .prepare()) );

Slide 51

Slide 51 text

#DroidConBos @ragdroid Observable Zip Observable FluxWeed CrabHair Polyjuice Potion Observable 
 return Observable.zip( fluxWeedObservable, hairObservable,
 (fluxWeed, student) -> new PolyJuice(fluxWeed, student.getHair()) .prepare()) );

Slide 52

Slide 52 text

#DroidConBos @ragdroid Can you relate the Polyjuice Potion Problem to any coding problem?

Slide 53

Slide 53 text

#DroidConBos @ragdroid Can you relate the Polyjuice Potion Problem to any coding problem? YES! When multiple API calls are executing simultaneously.

Slide 54

Slide 54 text

“Concat-ify” concat() operator “Merge-os” merge() operator VS

Slide 55

Slide 55 text

#DroidConBos @ragdroid Concat “Emit the emissions from two or more Observables without interleaving them” source “Combine multiple Observables into one by merging their emissions” source Merge

Slide 56

Slide 56 text

#DroidConBos @ragdroid Concat Merge 1 2 3 4 8 9 1 2 3 4 8 9 1 2 3 4 8 9 1 2 3 4 8 9 Concat-ify Merge-os

Slide 57

Slide 57 text

#DroidConBos @ragdroid Fictional Problem (Snape’s Assignment) • Professor Snape has requested all students to write an essay on werewolves. • The students who will turn in the essay first will get more points than the ones submitting later. • Students are divided into four house observables : • GryffindorObservable (G), • SlytherinObservable (S), • HufflepuffObservable (H) and • RavenclawObservable(R)).

Slide 58

Slide 58 text

#DroidConBos @ragdroid Observable Snape’s Assignment - Submission R1 R2 H1 H2 Observable Observable G1 G2 S1 S2 Observable

Slide 59

Slide 59 text

#DroidConBos @ragdroid Observable concatify() {
 Observable slytherinObservable = getObservable(House.SLYTHERIN);
 Observable huffleObervable = getObservable(House.HUFFLEPUFF);
 Observable ravenObservable = getObservable(House.RAVENCLAW);
 Observable gryffindorObservable = getObservable(House.GRYFFINDOR);
 return Observable.concat(
 slytherinObservable,
 huffleObervable,
 ravenObservable,
 gryffindorObservable);
 } Snape’s Assignment - Draco’s trick

Slide 60

Slide 60 text

#DroidConBos @ragdroid Snape’s Assignment - Draco’s trick S1 S2 H1 H2 R1 R2 G1 G2 Concat-ify Observable R1 R2 H1 H2 Observable Observable G1 G2 S1 S2 Observable

Slide 61

Slide 61 text

#DroidConBos @ragdroid Guess who is not so pleased?

Slide 62

Slide 62 text

#DroidConBos @ragdroid Guess who is not so pleased? YES!

Slide 63

Slide 63 text

#DroidConBos @ragdroid Guess who is not so pleased? YES! Poor Hermione

Slide 64

Slide 64 text

#DroidConBos @ragdroid Observable mergeos() {
 Observable slytherinObservable = getObservable(House.SLYTHERIN);
 Observable huffleObervable = getObservable(House.HUFFLEPUFF);
 Observable ravenObservable = getObservable(House.RAVENCLAW);
 Observable gryffindorObservable = getObservable(House.GRYFFINDOR);
 return Observable.merge(
 slytherinObservable,
 huffleObervable,
 ravenObservable,
 gryffindorObservable);
 } Snape’s Assignment - Hermione’s fix

Slide 65

Slide 65 text

#DroidConBos @ragdroid Snape’s Assignment - Hermione’s fix G1 S1 G2 R1 H1 S2 R2 H2 Merge-os Observable R1 R2 H1 H2 Observable Observable G1 G2 S1 S2 Observable

Slide 66

Slide 66 text

#DroidConBos @ragdroid Snape’s Assignment - Hermione’s fix

Slide 67

Slide 67 text

#DroidConBos @ragdroid • Hit the cache first • If data found return data • Else Network call Problem : Cache First Then Network

Slide 68

Slide 68 text

#DroidConBos @ragdroid • Hit the cache first • If data found return data • Else Network call Problem : Cache First Then Network Concat-ify

Slide 69

Slide 69 text

#DroidConBos @ragdroid • Hit the cache first • If data found return data • Else Network call Observable> cacheObservable = getLecturesFromCache();
 Observable> lecturesFromServer = getLecturesFromServer();
 return cacheObservable .concatWith(lecturesFromServer)
 .take(1); Problem : Cache First Then Network

Slide 70

Slide 70 text

#DroidConBos @ragdroid Fictional Problem (The Battle) • Dumbledore’s army (Harry, Hermione, Ron and others) • Death Eaters (Lucius Malfoy, Bellatrix Lestrange and others) • Each team is casting lethal spells against the other team. • Dumbledore’s army is not as experienced as the Death Eaters. • Spells produced by Death Eaters is overwhelming the Dumbledore’s army (consumer).

Slide 71

Slide 71 text

“Buffer-undum” buffer() operator

Slide 72

Slide 72 text

#DroidConBos @ragdroid Buffer • Buffer small chunks of items • Instead of emitting one item at a time. • Emit chunks

Slide 73

Slide 73 text

#DroidConBos @ragdroid Buffer-undum Buffer Observable 1 2 3 4 Observable 1 2 3 4

Slide 74

Slide 74 text

#DroidConBos @ragdroid Observable Buffer Observable 1 2 3 4 1 2 getSpellsObservable()
 .buffer(2); //count 3 4

Slide 75

Slide 75 text

#DroidConBos @ragdroid Buffer-undum Buffer LOSS-LESS Observable 1 2 3 4 Observable 1 2 3 4

Slide 76

Slide 76 text

#DroidConBos @ragdroid Buffer Observable 1 2 3 4 Observable 1 2 3 4

Slide 77

Slide 77 text

“Debounce-y” debounce() operator

Slide 78

Slide 78 text

#DroidConBos @ragdroid Debounce Emit an item only when, some time has passed since it last emitted anything.

Slide 79

Slide 79 text

#DroidConBos @ragdroid Debounce-y Debounce Observable 1 2 3 4 Observable 1 2 4

Slide 80

Slide 80 text

#DroidConBos @ragdroid Observable 1 2 3 4 Observable 1 2 4 Debounce

Slide 81

Slide 81 text

#DroidConBos @ragdroid Observable 1 2 3 4 Observable 1 2 4 LOSSY Debounce

Slide 82

Slide 82 text

#DroidConBos @ragdroid Observable 1 2 3 4 Observable 1 2 4 PROBLEM SOLVED Debounce

Slide 83

Slide 83 text

#DroidConBos @ragdroid Observable 1 2 3 4 Observable 1 2 4 getSpellsObservable()
 .debounce(300, TimeUnit.MILLISECONDS); Debounce

Slide 84

Slide 84 text

#DroidConBos @ragdroid Problem : Optimize Network Traffic Track User Events using any analytics library.

Slide 85

Slide 85 text

#DroidConBos @ragdroid Problem : Optimize Network Traffic Track User Events using any analytics library. Simple Approach Server request whenever an event occurs. Over chatty producer (User Events) Slow Consumer (Network Request)

Slide 86

Slide 86 text

#DroidConBos @ragdroid Problem : Optimize Network Traffic Track User Events using any analytics library. Buffer-undum Buffer some events before making a network request. Buffer-undum

Slide 87

Slide 87 text

#DroidConBos @ragdroid Problem : Optimize Network Traffic Track User Events using any analytics library. Buffer-undum Observable.just(new ArrayList())
 .buffer(3) // buffer count
 .flatMap(events -> Observable.just(new TrackRequest(events)));

Slide 88

Slide 88 text

#DroidConBos @ragdroid Problem : Auto-Search AutoComplete Search Suggestions

Slide 89

Slide 89 text

#DroidConBos @ragdroid Problem : Auto-Search AutoComplete Search Suggestions Simple Approach Server request whenever a character is typed Over chatty producer (User Input) Slow Consumer (Network Request)

Slide 90

Slide 90 text

#DroidConBos @ragdroid AutoComplete Search Suggestions Debounce-y Make a network request only if user has stopped typing. Debounce-y Solution : Auto-Search

Slide 91

Slide 91 text

#DroidConBos @ragdroid Solution : Subject

Slide 92

Slide 92 text

#DroidConBos @ragdroid Solution : Subject Producer Consumer A B C items Observable emits Subscriber consumes

Slide 93

Slide 93 text

#DroidConBos @ragdroid Solution : Subject Producer Consumer A B C items Subject emits Subscriber consumes subject.onNext()

Slide 94

Slide 94 text

#DroidConBos @ragdroid Solution : Subject Producer Consumer A B C items Subject emits Subject consumes subject.onNext() subject.subscribe()

Slide 95

Slide 95 text

#DroidConBos @ragdroid Solution : Subject Subject extends Observable implements Observer { }

Slide 96

Slide 96 text

#DroidConBos @ragdroid Solution : Subject Subject extends Observable implements Observer { } AsyncSubject BehaviorSubject PublishSuject ReplaySubject

Slide 97

Slide 97 text

#DroidConBos @ragdroid Solution : Subject Subject extends Observable implements Observer { } via-Hedwig We are going to use a PublishSubject for this purpose.

Slide 98

Slide 98 text

#DroidConBos @ragdroid Solution : Subject Subject extends Observable implements Observer { } via-Hedwig PublishSubject : once you subscribe, you get all the subsequent items.

Slide 99

Slide 99 text

#DroidConBos @ragdroid AutoComplete Search Suggestions Debounce-y publishSubject
 .debounce(300, TimeUnit.MILLISECONDS)
 .flatMap(new Function>>() {
 @Override
 public ObservableSource> apply(String searchTerm) {
 return dataSource.getBook(searchTerm);
 }
 }) Solution : Auto-Search

Slide 100

Slide 100 text

#DroidConBos @ragdroid Observable B Book Solution : Auto-Search Debounce-y String B Book Boo Bo x x

Slide 101

Slide 101 text

#DroidConBos @ragdroid AutoComplete Search Suggestions Debounce-y Solution : Auto-Search publishSubject
 .debounce(300, TimeUnit.MILLISECONDS)
 .flatMap(new Function>>() {
 @Override
 public ObservableSource> apply(String searchTerm) {
 return dataSource.getBook(searchTerm);
 }
 })

Slide 102

Slide 102 text

#DroidConBos @ragdroid Observable > flatMap-um Observable B Solution : Auto-Search (FlatMap) List1 List2 Book

Slide 103

Slide 103 text

#DroidConBos @ragdroid Observable > Observable B Solution : Auto-Search (FlatMap) List1 Nice & Good! List2 Book

Slide 104

Slide 104 text

#DroidConBos @ragdroid Observable > Observable B Solution : Auto-Search (FlatMap) What if Response (“Book) arrived before Response(“B”)? Book

Slide 105

Slide 105 text

#DroidConBos @ragdroid Observable > List1 List2 flatMap-um Observable B Book Solution : Auto-Search (FlatMap) 1000ms 200ms

Slide 106

Slide 106 text

#DroidConBos @ragdroid Solution : Auto-Search

Slide 107

Slide 107 text

#DroidConBos @ragdroid Solution : Auto-Search (FlatMap)

Slide 108

Slide 108 text

“ConcatMap-pum” concatMap() operator

Slide 109

Slide 109 text

#DroidConBos @ragdroid ConcatMap • Just like flatMap(), but … • Concatenates rather than merges

Slide 110

Slide 110 text

#DroidConBos @ragdroid Observable > List1 List2 flatMap-um Observable B Book Solution : Auto-Search (FlatMap) 1000ms 200ms

Slide 111

Slide 111 text

#DroidConBos @ragdroid Observable > List1 concatMap-um Observable B Book Solution : Auto-Search (ConcatMap) 1000ms 200ms

Slide 112

Slide 112 text

#DroidConBos @ragdroid Observable > List1 concatMap-um Observable B Book Solution : Auto-Search (ConcatMap) 1000ms 200ms S U B S C R I B E

Slide 113

Slide 113 text

#DroidConBos @ragdroid Observable > List1 concatMap-um Observable B Solution : Auto-Search (ConcatMap) 1000ms Book 200ms List2

Slide 114

Slide 114 text

#DroidConBos @ragdroid Solution : Auto-Search (ConcatMap)

Slide 115

Slide 115 text

#DroidConBos @ragdroid Solution : Auto-Search (ConcatMap) TOO SLOW!

Slide 116

Slide 116 text

“SwitchMap-pum” switchMap() operator

Slide 117

Slide 117 text

#DroidConBos @ragdroid SwitchMap • Just like flatMap(), but … • Unsubscribe to previous observable • When new item emitted

Slide 118

Slide 118 text

#DroidConBos @ragdroid SwitchMap Do not think of “SwitchMap” as switch() {case: }

Slide 119

Slide 119 text

#DroidConBos @ragdroid SwitchMap Think of it as switchTo(newObservable)

Slide 120

Slide 120 text

#DroidConBos @ragdroid SwitchMap It was earlier called flatMapLatest()

Slide 121

Slide 121 text

#DroidConBos @ragdroid Observable > List1 List2 flatMap-um Observable B Book Solution : Auto-Search (FlatMap) 1000ms 200ms

Slide 122

Slide 122 text

#DroidConBos @ragdroid Observable > List1 List2 switchMap-um Observable B Book Solution : Auto-Search (SwitchMap) 1000ms 200ms

Slide 123

Slide 123 text

#DroidConBos @ragdroid Observable > List2 switchMap-um Observable B Book Solution : Auto-Search (SwitchMap) 200ms UNSUBSCRIBE

Slide 124

Slide 124 text

#DroidConBos @ragdroid Solution : Auto-Search (SwitchMap)

Slide 125

Slide 125 text

#DroidConBos @ragdroid Solution : Auto-Search (SwitchMap) ALL SET!

Slide 126

Slide 126 text

“Thread Travel” with RxJava

Slide 127

Slide 127 text

#DroidConBos @ragdroid Thread It’s a thread of execution in a program.

Slide 128

Slide 128 text

#DroidConBos @ragdroid Schedulers For introducing multi-threading.

Slide 129

Slide 129 text

#DroidConBos @ragdroid Schedulers • Schedulers.computation() - for computational work • Schedulers.io() - for IO-bound work • AndroidSchedulers.mainThread() - executes actions on Android main thread • new TestScheduler() - intended for testing purposes

Slide 130

Slide 130 text

#DroidConBos @ragdroid • A new Thread is like a parallel universe • We all live in the main thread • Switching a thread - opening a portal to another dimension Fictional Threading

Slide 131

Slide 131 text

#DroidConBos @ragdroid • Hermione is always eager to gain knowledge. • Two lectures are going on at the same time. • She is stuck in the dilemma of how to attend both the lectures. Fictional Problem (Hermione’s Time Turner)

Slide 132

Slide 132 text

#DroidConBos @ragdroid • Hermione is always eager to gain knowledge. • Two lectures are going on at the same time. • She is stuck in the dilemma of how to attend both the lectures. Fictional Problem (Hermione’s Time Turner) via-Hedwig Time Turner allows hermione travel back in time

Slide 133

Slide 133 text

“Expecto-SubscribeOn” subscribeOn() operator

Slide 134

Slide 134 text

#DroidConBos @ragdroid SubscribeOn “specify the Scheduler on which an Observable will operate”

Slide 135

Slide 135 text

#DroidConBos @ragdroid SubscribeOn • Specify the Starting Scheduler • Switch threads

Slide 136

Slide 136 text

#DroidConBos @ragdroid SubscribeOn Start the magic

Slide 137

Slide 137 text

“Observe-ate” observeOn() operator

Slide 138

Slide 138 text

#DroidConBos @ragdroid ObserveOn • True magic of thread travel • Switch threads

Slide 139

Slide 139 text

#DroidConBos @ragdroid ObserveOn • True magic of thread travel • Switch threads via-Hedwig Potterly speaking, observe-ate can open portals to different dimensions

Slide 140

Slide 140 text

#DroidConBos @ragdroid Main Dimension Hermione’s Time Turner : Solution Main Thread

Slide 141

Slide 141 text

#DroidConBos @ragdroid Expecto-subscribeOn Background Main Thread Hermione’s Time Turner : Solution

Slide 142

Slide 142 text

#DroidConBos @ragdroid Expecto-subscribeOn Task Started Background Thread Hermione’s Time Turner : Solution ⌛ Main Thread

Slide 143

Slide 143 text

#DroidConBos @ragdroid Expecto-subscribeOn observe-ate Task Started Task Completed Hermione’s Time Turner : Solution Main Thread Background Thread

Slide 144

Slide 144 text

#DroidConBos @ragdroid Expecto-subscribeOn observe-ate Task Started Task Completed Hermione’s Time Turner : Solution Main Thread Background Thread

Slide 145

Slide 145 text

#DroidConBos @ragdroid Hermione’s Time Turner : Solution Observable.defer(new Callable>() {
 @Override
 public ObservableSource call() {
 return Observable.just(new Lecture(id)) .delay(id, TimeUnit.SECONDS);
 }
 }); getLectureObservable()

Slide 146

Slide 146 text

#DroidConBos @ragdroid Hermione’s Time Turner : Solution lectureOneObservable = getLectureObservable(1)
 .subscribeOn(AndroidSchedulers.mainThread())
 .observeOn(AndroidSchedulers.mainThread())
 .doOnNext(lecture -> {
 if (getView() != null) {
 getView().append("Attended Lecture " + lecture.getId());
 }
 });

Slide 147

Slide 147 text

#DroidConBos @ragdroid Hermione’s Time Turner : Solution lectureTwoObservable = getLectureObservable(2)
 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())
 .doOnNext(lecture -> {
 if (getView() != null) {
 getView().append("Attended Lecture " + lecture.getId());
 }
 });

Slide 148

Slide 148 text

#DroidConBos @ragdroid Hermione’s Time Turner : Solution 
 Observable.zip(lectureOneObservable, lectureTwoObservable,
 (lecture, lecture2) -> String.format("Attended Lectures %s and %s", lecture.getId(), lecture2.getId()))
 .subscribe(message -> {
 if (getView() != null) {
 getView().append(message);
 }
 }); Zip the two

Slide 149

Slide 149 text

#DroidConBos @ragdroid Hermione’s Time Turner : Action

Slide 150

Slide 150 text

#DroidConBos @ragdroid • Learn by practice • Make RxJava your friend and not a foe • Learn by examples - Kaushik Gopal RxJava https://github.com/kaushikgopal/RxJava-Android-Samples • Have a look at the source code of demo app https://github.com/ragdroid/rxify • Slides at speakerdeck https://speakerdeck.com/ragdroid/rxify-a-simple-spell-for-complex-rxjava-operators-1 • My Medium blogs for more details https://medium.com/@ragdroid What’s Next

Slide 151

Slide 151 text

#DroidConBos @ragdroid Acknowledgements via-Hedwig - Android community - Vikas @vickyturtle - Julien - Fueled - Ritesh @_Riteshhh - Droidcon Boston team

Slide 152

Slide 152 text

#DroidConBos @ragdroid Acknowledgements via-Hedwig The terms lossy and lossless have been inspired from the post here.

Slide 153

Slide 153 text

#DroidConBos @ragdroid Acknowledgements via-Hedwig Technical Definitions have been taken from website. http://reactivex.io/documentation/operators.html

Slide 154

Slide 154 text

#DroidConBos @ragdroid Acknowledgements via-Hedwig Response on medium article from Paul Woitaschek : https://medium.com/@woitaschek/its-better-to-use-switchmap- as-you-don-t-care-about-old-results-315029110c75

Slide 155

Slide 155 text

#DroidConBos @ragdroid Acknowledgements via-Hedwig Gifs have been taken from giphy.com.

Slide 156

Slide 156 text

#DroidConBos @ragdroid Thank You

Slide 157

Slide 157 text

FUELED http://fueled.com [email protected] +1.800.962.4587 568 Broadway, 11th Flr. New York, NY 10012 Questions?