Slide 1

Slide 1 text

Reactive and Functional Programming David Tiago Conceição Involves Android Dev BR @davidtiagocon Tales of failure and learning

Slide 2

Slide 2 text

Once upon a time...

Slide 3

Slide 3 text

Asynchronous code ● Callbacks

Slide 4

Slide 4 text

Asynchronous code ● Callbacks someObject.longNetworkOperation( new NetworkOperationCallback() { void onOperationResult(Result result) { updateScreen(result); } });

Slide 5

Slide 5 text

Asynchronous code ● Callbacks someObject.longNetworkOperation( new NetworkOperationCallback() { void onOperationResult(Result result) { updateScreen(result); } void onSomethingWentWrong(WhatWentWrong what) { showError(what); } });

Slide 6

Slide 6 text

Asynchronous code ● Callbacks someObject.longNetworkOperation( new NetworkOperationCallback(){ void onOperationResult(Result result){ anotherObject.doAnotherLongOperation( result, new NetworkOperationCallback(){ void onOperationResult(Result result){ finallyShowTheResult(result); ...

Slide 7

Slide 7 text

Asynchronous code ● Callbacks someObject.longNetworkOperation( new NetworkOperationCallback(){ void onOperationResult(Result result){ anotherObject.doAnotherLongOperation( result, new NetworkOperationCallback(){ void onOperationResult(Result result){ finallyShowTheResult(result); } void onSomethingWentWrong(WhatWentWrong what){ showError(what); } } } void onSomethingWentWrong(WhatWentWrong what){ showError(what); } });

Slide 8

Slide 8 text

Asynchronous code ● Callbacks someObject.longNetworkOperation( new NetworkOperationCallback(){ void onOperationResult(Result result){ anotherObject.doAnotherLongOperation( result, new NetworkOperationCallback(){ void onOperationResult(Result result){ runOnUiThread(new Runnable(){ void run(){ finallyShowTheResult(result); } }); } void onSomethingWentWrong(WhatWentWrong what){ runOnUiThread(new Runnable(){ showError(what); }); } } } void onSomethingWentWrong(WhatWentWrong what){ showError(what); } });

Slide 9

Slide 9 text

Asynchronous code ● Callbacks someObject.longNetworOperation( new NetworkOperationCallback(){ void onOperationResult(Result result){ anotherObject.doAnotherLongOperation( result, new NetworkOperationCallback(){ void onOperationResult(Result result){ runOnUiThread(new Runnable(){ void run(){ finallyShowTheResult(result); } }); } void onSomethingWentWrong(WhatWentWrong what){ runOnUiThread(new Runnable(){ showError(what); }); } } } void onSomethingWentWrong(WhatWentWrong what){ showError(what); } }); https://storage.googleapis.com/material-design/publish/material_v_11/assets/0Bzhp5Z4wHba3NnpEM2lLc0NKd1U/notifications_templates_04_progress.png

Slide 10

Slide 10 text

Asynchronous code

Slide 11

Slide 11 text

Asynchronous code ● AsyncTasks private class NetworkOperation extends AsyncTask { protected Long doInBackground(Input... inputs) { return someLongNetworkOperation(inputs); } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }

Slide 12

Slide 12 text

Asynchronous code ● IntentService public class NetworkService extends IntentService { @Override protected void onHandleIntent(Intent workIntent) { longNetworkOperation(workIntent); } }

Slide 13

Slide 13 text

Asynchronous code

Slide 14

Slide 14 text

https://thumb7.shutterstock.com/display_pic_with_logo/164459732/518981521/stock-photo-react-stamp-sign-text-word-logo-black-518981521.jpg

Slide 15

Slide 15 text

Reactive Extensions “An API for asynchronous programming with observable streams.” http://reactivex.io/

Slide 16

Slide 16 text

Reactive Extensions “An API for asynchronous programming with observable streams.” “The Observer pattern done right.” http://reactivex.io/

Slide 17

Slide 17 text

RxJava ● Creating an Observable Single.fromCallable(() -> { return someNetworkOperation();}) .subscribeWith(new DisposableSingleObserver() { public void onSuccess(NetworkResult result) { updateScreen(result); } public void onError(Throwable e) { showError(e); } });

Slide 18

Slide 18 text

RxJava ● Creating an Observable Single.fromCallable(() -> { return someNetworkOperation(); }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSingleObserver() { public void onSuccess(NetworkResult result) { updateScreen(result); } public void onError(Throwable e) { showError(e); } });

Slide 19

Slide 19 text

RxJava ● Creating an Observable Single.fromCallable(() -> { return someNetworkOperation(); }) .flatMap(networkResult -> { return anotherNetworkOperation(networkResult); }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSingleObserver() { public void onSuccess(NetworkResult result) { updateScreen(result); } public void onError(Throwable e) { showError(e); } });

Slide 20

Slide 20 text

RxJava ● Creating an Observable compositeDisposable = new CompositeDisposable(); // ... compositeDisposable.add(createStream()); // ... compositeDisposable.clear(); https://storage.googleapis.com/material-design/publish/material_v_11/assets/0Bzhp5Z4wHba3NnpEM2lLc0NKd1U/notifications_templates_04_progress.png

Slide 21

Slide 21 text

RxJava

Slide 22

Slide 22 text

RxJava

Slide 23

Slide 23 text

Reactive Extensions “CREATE, COMBINE, LISTEN” http://reactivex.io/

Slide 24

Slide 24 text

RxJava ● Create Single.fromCallable(() -> { return someNetworkOperation();}) .subscribeWith(new DisposableSingleObserver() { public void onSuccess(NetworkResult result) { updateScreen(result); } public void onError(Throwable e) { showError(e); } });

Slide 25

Slide 25 text

RxJava ● Combine Single.fromCallable(() -> { return someNetworkOperation(); }) .flatMap(networkResult -> { return anotherNetworkOperation(networkResult); }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSingleObserver() { public void onSuccess(NetworkResult result) { updateScreen(result); } public void onError(Throwable e) { showError(e); } });

Slide 26

Slide 26 text

RxJava ● Listen Single.fromCallable(() -> { return someNetworkOperation(); }) .flatMap(networkResult -> { return anotherNetworkOperation(networkResult); }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSingleObserver() { public void onSuccess(NetworkResult result) { updateScreen(result); } public void onError(Throwable e) { showError(e); } });

Slide 27

Slide 27 text

RxJava ● Stream Single.fromCallable(() -> { return someNetworkOperation(); }) .flatMap(networkResult -> { return anotherNetworkOperation(networkResult); }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSingleObserver() { public void onSuccess(NetworkResult result) { updateScreen(result); } public void onError(Throwable e) { showError(e); } });

Slide 28

Slide 28 text

Growing Strong ● Start composing ○ Large streams composed by smaller ● Less logic ● More data flow

Slide 29

Slide 29 text

Growing Strong class SomeNetworkClass { Observable longNetworkOperation(Parameters parameters){ // Compose networkParameters return NetworkLibrary.createNetworkRequest(networkParameters); } } // ... someNetworkInstance.longNetworkOperation(parameters) .doOnNext(Cache::saveToCache) .subscribeWith( // subscriber ...

Slide 30

Slide 30 text

Growing Strong class SomeNetworkClass { Observable longNetworkOperation(Parameters parameters){ // Compose networkParameters return NetworkLibrary.createNetworkRequest(networkParameters); } } // ... someNetworkInstance.longNetworkOperation(parameters) .doOnNext(Cache::saveToCache) .subscribeWith( // subscriber ...

Slide 31

Slide 31 text

Race Conditions moviesRemoteRepository.getUpcoming(currentPageCount) .map(new Function() { public Movie apply(Movie movie) throws Exception { return MovieUtil.mapMovieFields( movie, imageConfiguration, genres); } }) .toList() //...

Slide 32

Slide 32 text

Race conditions moviesRemoteRepository.getUpcoming(currentPageCount) .map(new Function() { public Movie apply(Movie movie) throws Exception { return MovieUtil.mapMovieFields( movie, imageConfiguration, genres); } }) .toList() //...

Slide 33

Slide 33 text

Reactive Extensions “ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming.” http://reactivex.io/

Slide 34

Slide 34 text

Functional Programming ● Mathematical concepts ● High order functions ● Immutability ● Lambdas ● Monads ● Pure functions

Slide 35

Slide 35 text

Pure Functions ● Output determined by the input ● No side effects ● An input generates always the same output

Slide 36

Slide 36 text

Pure Functions int sum(int firstNumber, int secondNumber){ return firstNumber + secondNumber; }

Slide 37

Slide 37 text

Pure Functions moviesRemoteRepository.getUpcoming(currentPageCount) .merge(//... Stream of more data .combineLatest( //... Stream of more data .toList() //...

Slide 38

Slide 38 text

Pure Functions ● Easily processed in parallel ○ Highly scalable ● Independent Streams ● Easy to read, maintain and test

Slide 39

Slide 39 text

Reactive Architectures ● Communication through streams

Slide 40

Slide 40 text

Reactive Architectures ● Communication through streams ● Components reacting to each other

Slide 41

Slide 41 text

Everything as stream ● User inputs ● I/O ● Internal events ● System events

Slide 42

Slide 42 text

What could go wrong? ● State, error handling, and much more

Slide 43

Slide 43 text

Propagating state ● Single source of truth ● Hot Observables ● Mapping, flat mapping and others

Slide 44

Slide 44 text

Handling errors ● onError invalidates the stream ● Error as state ● Propagate an error state ● Avoids invalidation

Slide 45

Slide 45 text

Much more ● Complex streams ● Weird use cases

Slide 46

Slide 46 text

And now? ● Key architectural component ● Can’t work without it

Slide 47

Slide 47 text

How to know more? ● ReactiveX reactivex.io ● RxJava for Android App Development oreilly.com/programming/free/rxjava-for-android-app-development.csp ● Reactive Programming on Android with RxJava leanpub.com/reactiveandroid ● Managing State with RxJava by Jake Wharton www.youtube.com/watch?v=0IKHxjkgop4 ● Object-Oriented vs. Functional Programming oreilly.com/programming/free/object-oriented-vs-functional-programming.csp

Slide 48

Slide 48 text

slack.AndroidDevBR.org Android Dev BR

Slide 49

Slide 49 text

Thank you! David Tiago Conceição Android Developer @ Involves Android Dev BR @davidtiagoconceicao twitter.com/@davidtiagocon github.com/davidtcdeveloper Slides