rxjava meetup presentation

104
Guillaume Valverde Software Developer [email protected] @drevlav A year with RXJava September / 2016

Upload: guillaume-valverde

Post on 09-Jan-2017

86 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Rxjava meetup presentation

Guillaume Valverde Software Developer [email protected] @drevlav

A year with RXJavaSeptember / 2016

Page 2: Rxjava meetup presentation

Kick Application

Page 3: Rxjava meetup presentation

Observable / Observer Pattern

Observable : emits event.

Observer : listens to events and acts accordingly.

Page 4: Rxjava meetup presentation

Observable: emits data called a stream

Emits 0, 1, x or an infinite amount of items

Page 5: Rxjava meetup presentation

Observable: emits data called a stream

Emits 0, 1, x or an infinite amount of items

Page 6: Rxjava meetup presentation

Observable: emits data called a stream

Emits 0, 1, x or an infinite amount of items

Page 7: Rxjava meetup presentation

Observable: emits data called a stream

Emits 0, 1, x or an infinite amount of items

Page 8: Rxjava meetup presentation

Observable: emits data called a stream

Emits 0, 1, x or an infinite amount of items

Complete

Page 9: Rxjava meetup presentation

Observable: emits data called a stream

Emits 0, 1, x or an infinite amount of items

Complete

Page 10: Rxjava meetup presentation

Observable: emits data called a stream

Emits 0, 1, x or an infinite amount of items

Send an error

Page 11: Rxjava meetup presentation

Observable: emits data called a stream

Emits 0, 1, x or an infinite amount of items

Send an error

Page 12: Rxjava meetup presentation

OBSERVABLE CONTRACT

0 to N events

nothing | error | complete

Page 13: Rxjava meetup presentation

Observable exemples:• Mouse clicks• Button Clicks• Network request • Network State• Content Provider

update• list, array• UI State

Everything is an event

Page 14: Rxjava meetup presentation

Observable.just(“rxjava”)

“rxjava”

Observable.just(“rxjava”) .subscribe();

Page 15: Rxjava meetup presentation

Observable.from(…)

1 2 3

Integer[] ids = {1, 2, 3};Observable.from(ids) .subscribe();

Page 16: Rxjava meetup presentation

Using Retrofit

Network Request

Response

Page 17: Rxjava meetup presentation

RxView.clicks(View view)

first click

RxView.clicks(sendButton) .subscribe(click -> { do something… })

Second click

Third click

Page 18: Rxjava meetup presentation

who is listening?

Page 19: Rxjava meetup presentation

who is listening?The subscriber

Page 20: Rxjava meetup presentation

who is listening?The subscriber

Page 21: Rxjava meetup presentation

who is listening?The subscriber

Integer[] ids = {1, 2, 3};Observable.from(ids) .subscribe();

Page 22: Rxjava meetup presentation

who is listening?The subscriber

Integer[] ids = {1, 2, 3};Observable.from(ids) .subscribe();

Page 23: Rxjava meetup presentation

Subscriber: Observer & subscription

public abstract class Subscriber<T> implements Observer<T>, Subscription {

}

Page 24: Rxjava meetup presentation

Subscriber : Observer & Subscription

public interface Observer<T> { void onCompleted(); void onError(Throwable e); void onNext(T t);}

public interface Subscription { void unsubscribe(); boolean isUnsubscribed();}

Page 25: Rxjava meetup presentation

Observable / Subscriber (Observer & Subscription)

String[] ids = {"1", "2", "3"};

Subscription subscription = Observable.from(ids) .subscribe(id -> Log.v(TAG, id), error -> Log.e(TAG, "error: " + error.getMessage()), () -> Log.v(TAG, "complete"));

Page 26: Rxjava meetup presentation

Stream on steroids operators

Composition

Page 27: Rxjava meetup presentation

Map

RXJava is Awesome

.map(word -> word.length())

6 2 7

String[] ids = {“RXJava”, “is”, “Awesome”};Observable.from(ids)

Page 28: Rxjava meetup presentation

FlatMap1 2 3

Page 29: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

Page 30: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

Page 31: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

22

Page 32: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

22

33

Page 33: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

22

33

.flatten

Page 34: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

22

33

.flatten

Page 35: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

22

33

.flatten

1

Page 36: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

22

33

.flatten

1 2

Page 37: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

22

33

.flatten

1 2 2

Page 38: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

22

33

.flatten

1 2 2 1

Page 39: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

22

33

.flatten

1 2 2 1 3

Page 40: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

22

33

.flatten

1 2 2 1 3 3

Page 41: Rxjava meetup presentation

FlatMap1 2 3

.Flatmap ( )xxx

11

22

33

.flatten

1 2 2 1 3 3

Page 42: Rxjava meetup presentation

id1 id2 id3

.flatMap(id -> fetchArticle())

Article1 Article2 Article3

FlatMapList ids … Observable.from(ids)

Page 43: Rxjava meetup presentation

Compose withObservables

Retrieve a list of repositories

• more than 3 letters• cancel previous search when new one• make a search when the user is done typing

Page 44: Rxjava meetup presentation

Compose with ObservablesRxTextView.textChanges(editText) .observeOn(Schedulers.io()) .debounce(500, TimeUnit.MILLISECONDS) .filter(charSequence -> charSequence.length() > 3) .map(CharSequence::toString) .switchMap(searchString -> networkManager.search(searchString)) .observeOn(AndroidSchedulers.mainThread()) .subscribe(list -> searchRecyclerAdapter.refreshListRepo(list), error -> Logger.logOnNextError(TAG));

Page 45: Rxjava meetup presentation

Type RxJava

Page 46: Rxjava meetup presentation

Type RxJava

RxTextView.textChanges(editText)

Page 47: Rxjava meetup presentation

Type RxJava

R Rx RxJ RxJa RxJav RxJava

RxTextView.textChanges(editText)

Page 48: Rxjava meetup presentation

Type RxJava

R Rx RxJ RxJa RxJav RxJava

RxTextView.textChanges(editText)

.observeOn(Schedulers.io())

Page 49: Rxjava meetup presentation

Type RxJava

R Rx RxJ RxJa RxJav RxJava

R Rx RxJ RxJa RxJav RxJava

RxTextView.textChanges(editText)

.observeOn(Schedulers.io())

Page 50: Rxjava meetup presentation

Type RxJava

R Rx RxJ RxJa RxJav RxJava

R Rx RxJ RxJa RxJav RxJava

RxTextView.textChanges(editText)

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

Page 51: Rxjava meetup presentation

Type RxJava

R Rx RxJ RxJa RxJav RxJava

R Rx RxJ RxJa RxJav RxJava

RxTextView.textChanges(editText)

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

RxJ RxJavaR

Page 52: Rxjava meetup presentation

Type RxJava

R Rx RxJ RxJa RxJav RxJava

R Rx RxJ RxJa RxJav RxJava

RxTextView.textChanges(editText)

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

.filter(charSequence -> charSequence.length() >= 3)

RxJ RxJavaR

Page 53: Rxjava meetup presentation

Type RxJava

R Rx RxJ RxJa RxJav RxJava

R Rx RxJ RxJa RxJav RxJava

RxJ RxJava

RxTextView.textChanges(editText)

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

.filter(charSequence -> charSequence.length() >= 3)

RxJ RxJavaR

Page 54: Rxjava meetup presentation

RxJ RxJava

RxTextView.textChanges(editText) .observeOn(Schedulers.io()) .debounce(500, TimeUnit.MILLISECONDS) .filter(charSequence -> charSequence.length() > 3) .map(CharSequence::toString)

Page 55: Rxjava meetup presentation

RxJ RxJava

RxTextView.textChanges(editText) .observeOn(Schedulers.io()) .debounce(500, TimeUnit.MILLISECONDS) .filter(charSequence -> charSequence.length() > 3) .map(CharSequence::toString)

.switchMap(searchString -> networkManager.search(searchString))

Page 56: Rxjava meetup presentation

RxJ RxJava

RxTextView.textChanges(editText) .observeOn(Schedulers.io()) .debounce(500, TimeUnit.MILLISECONDS) .filter(charSequence -> charSequence.length() > 3) .map(CharSequence::toString)

.switchMap(searchString -> networkManager.search(searchString))

List<Repo>

Page 57: Rxjava meetup presentation

RxJ RxJava

RxTextView.textChanges(editText) .observeOn(Schedulers.io()) .debounce(500, TimeUnit.MILLISECONDS) .filter(charSequence -> charSequence.length() > 3) .map(CharSequence::toString)

.switchMap(searchString -> networkManager.search(searchString)) List<Repo>

List<Repo>

Page 58: Rxjava meetup presentation

RxJ RxJava

RxTextView.textChanges(editText) .observeOn(Schedulers.io()) .debounce(500, TimeUnit.MILLISECONDS) .filter(charSequence -> charSequence.length() > 3) .map(CharSequence::toString)

.switchMap(searchString -> networkManager.search(searchString)) List<Repo>

List<Repo>

List<Repo>

Page 59: Rxjava meetup presentation

RxTextView.textChanges(editText) .observeOn(Schedulers.io()) .debounce(500, TimeUnit.MILLISECONDS) .filter(charSequence -> charSequence.length() > 3) .map(CharSequence::toString) .switchMap(searchString -> networkManager.search(searchString))

List<Repo>

Page 60: Rxjava meetup presentation

RxTextView.textChanges(editText) .observeOn(Schedulers.io()) .debounce(500, TimeUnit.MILLISECONDS) .filter(charSequence -> charSequence.length() > 3) .map(CharSequence::toString) .switchMap(searchString -> networkManager.search(searchString))

List<Repo>

.observeOn(AndroidSchedulers.mainThread())

Page 61: Rxjava meetup presentation

RxTextView.textChanges(editText) .observeOn(Schedulers.io()) .debounce(500, TimeUnit.MILLISECONDS) .filter(charSequence -> charSequence.length() > 3) .map(CharSequence::toString) .switchMap(searchString -> networkManager.search(searchString))

List<Repo>

.observeOn(AndroidSchedulers.mainThread())

List<Repo>

Page 62: Rxjava meetup presentation

RxTextView.textChanges(editText) .observeOn(Schedulers.io()) .debounce(500, TimeUnit.MILLISECONDS) .filter(charSequence -> charSequence.length() > 3) .map(CharSequence::toString) .switchMap(searchString -> networkManager.search(searchString))

List<Repo>

.observeOn(AndroidSchedulers.mainThread())

List<Repo>

.subscribe(list -> searchRecyclerAdapter.refreshListRepo(list), error -> Logger.logOnNextError(TAG));

Page 63: Rxjava meetup presentation

R Rx RxJ RxJa RxJav RxJava

R Rx RxJ RxJa RxJav RxJava

RxJ RxJava

RxJ RxJava

List<Repo>

List<Repo>

R

Page 64: Rxjava meetup presentation

RXjava is synchronous by default

Page 65: Rxjava meetup presentation

RXjava is synchronous by default

for(String word: sentence) { Log.v(TAG, word);}

Page 66: Rxjava meetup presentation

RXjava is synchronous by default

Same as

for(String word: sentence) { Log.v(TAG, word);}

Page 67: Rxjava meetup presentation

RXjava is synchronous by default

Same as

for(String word: sentence) { Log.v(TAG, word);}

Observable.from(sentence) .subscribe(word -> Log.v(TAG, word));

Page 68: Rxjava meetup presentation

THREADING

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 69: Rxjava meetup presentation

THREADING

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 70: Rxjava meetup presentation

THREADING

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 71: Rxjava meetup presentation

ObserveOn / SubscribeOn

Observable.from(ids)

.flatMap(id -> fetchArticle())

.subscribeOn(… newThread)

.observeOn(… mainThread)

.subscribe(…)

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 72: Rxjava meetup presentation

ObserveOn / SubscribeOn

Observable.from(ids)

.flatMap(id -> fetchArticle())

.subscribeOn(… newThread)

.observeOn(… mainThread)

.subscribe(…) CurrentThread

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 73: Rxjava meetup presentation

ObserveOn / SubscribeOn

Observable.from(ids)

.flatMap(id -> fetchArticle())

.subscribeOn(… newThread)

.observeOn(… mainThread)

.subscribe(…)

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 74: Rxjava meetup presentation

ObserveOn / SubscribeOn

Observable.from(ids)

.flatMap(id -> fetchArticle())

.subscribeOn(… newThread)

.observeOn(… mainThread)

.subscribe(…)

ChangeThread,New Thread

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 75: Rxjava meetup presentation

ObserveOn / SubscribeOn

Observable.from(ids)

.flatMap(id -> fetchArticle())

.subscribeOn(… newThread)

.observeOn(… mainThread)

.subscribe(…)

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 76: Rxjava meetup presentation

ObserveOn / SubscribeOn

Observable.from(ids)

.flatMap(id -> fetchArticle())

.subscribeOn(… newThread)

.observeOn(… mainThread)

.subscribe(…)

emit ids

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 77: Rxjava meetup presentation

ObserveOn / SubscribeOn

Observable.from(ids)

.flatMap(id -> fetchArticle())

.subscribeOn(… newThread)

.observeOn(… mainThread)

.subscribe(…)

emit an Article

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 78: Rxjava meetup presentation

ObserveOn / SubscribeOn

Observable.from(ids)

.flatMap(id -> fetchArticle())

.subscribeOn(… newThread)

.observeOn(… mainThread)

.subscribe(…)

emit an Article

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 79: Rxjava meetup presentation

ObserveOn / SubscribeOn

Observable.from(ids)

.flatMap(id -> fetchArticle())

.subscribeOn(… newThread)

.observeOn(… mainThread)

.subscribe(…) emit an Article

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 80: Rxjava meetup presentation

ObserveOn / SubscribeOn

Observable.from(ids)

.flatMap(id -> fetchArticle())

.subscribeOn(… newThread)

.observeOn(… mainThread)

.subscribe(…) act on Article

Observable.from(ids) .flatMap(id -> fetchArticle()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(article -> actOnArticle(article));

Page 81: Rxjava meetup presentation

THREADING SubscribeOn / ObserveOn

• Only 1 SubscribeOn effective.

• Multiple ObserveOn can work.

Page 82: Rxjava meetup presentation

Organise your codeArchitecture / View Model / Separation of concern

Page 83: Rxjava meetup presentation

business LogicReturn Observable

Input :Source Observable

.subscribe()

Page 84: Rxjava meetup presentation

Unittesting

Integrationtesting

Acceptance / smoketesting

Page 85: Rxjava meetup presentation

ViewView Model

Architecture

Hold the business logicFor the View

display uiaccording to state of the data

Data Layer

Store

Store

Binding

Hold the logic for dataemits Pojos

Page 86: Rxjava meetup presentation

ViewView Model

Architecture

Hold the business logicFor the View

display uiaccording to state of the data

Data Layer

Store

Store

Binding

Hold the logic for dataemits Pojos

Page 87: Rxjava meetup presentation

ViewView Model

Architecture

Hold the business logicFor the View

display uiaccording to state of the data

Data Layer

Store

Store

Binding

Hold the logic for dataemits Pojos

Page 88: Rxjava meetup presentation

ViewView Model

Architecture

Hold the business logicFor the View

display uiaccording to state of the data

Data Layer

Store

Store

Binding

Hold the logic for dataemits Pojos

Page 89: Rxjava meetup presentation

ViewView Model

Architecture

Hold the business logicFor the View

display uiaccording to state of the data

Data Layer

Store

Store

Binding

Hold the logic for dataemits Pojos

Page 90: Rxjava meetup presentation

ViewView Model

Architecture

Hold the business logicFor the View

display uiaccording to state of the data

Data Layer

Store

Store

Binding

Hold the logic for dataemits Pojos

updatetrigger

Page 91: Rxjava meetup presentation

ViewView Model

Architecture

Hold the business logicFor the View

display uiaccording to state of the data

Data Layer

Store

Store

Binding

Hold the logic for dataemits Pojos

Page 92: Rxjava meetup presentation

ViewView Model

Architecture

Hold the business logicFor the View

display uiaccording to state of the data

Data Layer

Store

Store

Binding

Hold the logic for dataemits Pojos

Page 93: Rxjava meetup presentation

ViewView Model

Architecture

Hold the business logicFor the View

display uiaccording to state of the data

Data Layer

Store

Store

Binding

Hold the logic for dataemits Pojos

Page 94: Rxjava meetup presentation

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

.filter(charSequence -> charSequence.length() > 3)

.map(CharSequence::toString)

.switchMap(word -> dataLayer.fetchListRepo(word))

.observeOn(AndroidSchedulers.mainThread())

RxTextView.textChanges(editText)

.subscribe(list -> searchRecyclerAdapter.refreshListRepo(list), error -> Logger.logOnNextError(TAG));

Page 95: Rxjava meetup presentation

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

.filter(charSequence -> charSequence.length() > 3)

.map(CharSequence::toString)

.switchMap(word -> dataLayer.fetchListRepo(word))

.observeOn(AndroidSchedulers.mainThread())

Input :Source Observable

RxTextView.textChanges(editText)

.subscribe(list -> searchRecyclerAdapter.refreshListRepo(list), error -> Logger.logOnNextError(TAG));

dataLayer

UIView

dependencies:

Page 96: Rxjava meetup presentation

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

.filter(charSequence -> charSequence.length() > 3)

.map(CharSequence::toString)

.switchMap(word -> dataLayer.fetchListRepo(word))

.observeOn(AndroidSchedulers.mainThread())

ViewModel

Input :Source Observable

RxTextView.textChanges(editText)

.subscribe(list -> searchRecyclerAdapter.refreshListRepo(list), error -> Logger.logOnNextError(TAG));

dataLayer

UIView

dependencies:

Page 97: Rxjava meetup presentation

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

.filter(charSequence -> charSequence.length() > 3)

.map(CharSequence::toString)

.switchMap(word -> dataLayer.fetchListRepo(word))

.observeOn(AndroidSchedulers.mainThread())

ViewModel

Input :Source Observable

RxTextView.textChanges(editText)

.subscribe(list -> searchRecyclerAdapter.refreshListRepo(list), error -> Logger.logOnNextError(TAG));

dataLayer

UIView

dependencies:

Page 98: Rxjava meetup presentation

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

.filter(charSequence -> charSequence.length() > 3)

.map(CharSequence::toString)

.switchMap(word -> dataLayer.fetchListRepo(word))

.observeOn(AndroidSchedulers.mainThread())

ViewModel

Input :Source Observable

.subscribe(…)

RxTextView.textChanges(editText)

.subscribe(list -> searchRecyclerAdapter.refreshListRepo(list), error -> Logger.logOnNextError(TAG));

dataLayer

UIView

dependencies:

Page 99: Rxjava meetup presentation

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

.filter(charSequence -> charSequence.length() > 3)

.map(CharSequence::toString)

.switchMap(word -> dataLayer.fetchListRepo(word))

.observeOn(AndroidSchedulers.mainThread())

ViewModel

Input :Source Observable

.subscribe(…)

RxTextView.textChanges(editText)

.subscribe(list -> searchRecyclerAdapter.refreshListRepo(list), error -> Logger.logOnNextError(TAG));

dataLayer

UIView

dependencies:

Page 100: Rxjava meetup presentation

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

.filter(charSequence -> charSequence.length() > 3)

.map(CharSequence::toString)

.switchMap(word -> dataLayer.fetchListRepo(word))

.observeOn(AndroidSchedulers.mainThread())

ViewModel

Input :Source Observable

.subscribe(…)

RxTextView.textChanges(editText)

.subscribe(list -> searchRecyclerAdapter.refreshListRepo(list), error -> Logger.logOnNextError(TAG));

dataLayer

UIView

dependencies:

Page 101: Rxjava meetup presentation

.observeOn(Schedulers.io())

.debounce(500, TimeUnit.MILLISECONDS)

.filter(charSequence -> charSequence.length() > 3)

.map(CharSequence::toString)

.switchMap(word -> dataLayer.fetchListRepo(word))

.observeOn(AndroidSchedulers.mainThread())

ViewModel

Input :Source Observable

.subscribe(…)

RxTextView.textChanges(editText)

.subscribe(list -> searchRecyclerAdapter.refreshListRepo(list), error -> Logger.logOnNextError(TAG));

dataLayer

UIView

dependencies:

Page 102: Rxjava meetup presentation

ViewView Model

Architecture

Hold the business logicFor the View

display uiaccording to state of the data

Data Layer

Store

Store

Binding

Hold the logic for dataemits Pojos

Page 103: Rxjava meetup presentation

public class ViewModel { private Observable<CharSequence> charSequenceObservable; private DataLayer dataLayer; ViewModel(Observable<CharSequence> charSequenceObservable, DataLayer dataLayer) { this.charSequenceObservable = charSequenceObservable; this.dataLayer = dataLayer; } Observable<List<GitHubRepository>> getListObservable() { return charSequenceObservable .observeOn(Schedulers.io()) .debounce(500, TimeUnit.MILLISECONDS) .filter(charSequence -> charSequence.length() > 3) .map(CharSequence::toString) .switchMap(word -> dataLayer.search(word)); }}

Page 104: Rxjava meetup presentation

Thank you