Slide 1

Slide 1 text

RxJava from Scratch O guia do aprendizado Paula Rosa @_paulacr

Slide 2

Slide 2 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | AGENDA • Programação imperativa x reativa • Observer pattern • RxJava • Observables, Observers e Operadores • Threads • Disposables • Próximos passos para estudar • Considerações finais

Slide 3

Slide 3 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH PROGRAMAÇÃO IMPERATIVA

Slide 4

Slide 4 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | PROGRAMAÇÃO IMPERATIVA Características principais • Ênfase em ações, enunciados ou comandos que mudam o estado (variáveis) de um programa • Uma série de instruções, com iterações, controle de fluxo, e tomadas de decisão • Traz complexidade quando temos que lidar com dados assíncronos • Traz complexidade quando precisamos utilizar requisições de forma complexa

Slide 5

Slide 5 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | PROGRAMAÇÃO IMPERATIVA Busca dados Mostra feedback ao usuario Acesso a API, network, banco de dados, etc… Loading, Toast text Mostra o dado e esconde o loading

Slide 6

Slide 6 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH PROGRAMAÇÃO REATIVA

Slide 7

Slide 7 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | PROGRAMAÇÃO REATIVA • Novo paradigma de programação orientado a eventos e propagação de mudanças • É visto como uma sequência de eventos • Busca facilitar o tratamento de eventos assíncronos, proporcionando: • Redução de código / Diminuição de código duplicado • Melhor controle de fluxo / Melhor controle dos erros Evento 1 Evento 2 Síncrono Evento 1 Evento 2 Assíncrono

Slide 8

Slide 8 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH OBSERVER PATTERN

Slide 9

Slide 9 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OBSERVER PATTERN Observer Observer Observer Inscrição Inscrição Inscrição Subject (Observable) Notificação Necessidade - Saber quando o preço da passagem abaixou Notificação

Slide 10

Slide 10 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OBSERVER PATTERN - OBSERVABLE interface FlightObservable { fun registerObserver(observable: FlightObserver) fun removeObserver(observable: FlightObserver) }

Slide 11

Slide 11 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OBSERVER PATTERN - OBSERVABLE class UserRepository: FlightObservable { override fun registerObserver(obs: FlightObserver) {} override fun removeObserver(obs: FlightObserver) {} fun setData(flightNumber: String, price: String) { this.flightNumber = flightNumber this.price = price observers.forEach { it.onDataChanged(flightNumber, price) } }

Slide 12

Slide 12 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OBSERVER PATTERN - OBSERVER interface FlightObserver { fun onPriceChanged(flightNumber: String, price: String) }

Slide 13

Slide 13 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OBSERVER PATTERN - OBSERVER class MainViewModel: ViewModel(), FlightObserver { override fun onPriceChanged(flightNumber: String, price: String) { //Notify user } }

Slide 14

Slide 14 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH RXJAVA

Slide 15

Slide 15 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | RXJAVA Características • É uma biblioteca que segue os princípios da programação reativa • Inspirado no Observer Pattern • É utilizado para trabalhar com eventos assíncronos • Pode ser utilizado em diversas linguagens do mercado: • Java: RxJava • JavaScript: RxJS • C#: Rx.NET • C#(Unity): UniRx • Scala: RxScala • Clojure: RxClojure • C++: RxCpp • Lua: RxLua • Ruby: Rx.rb • Python: RxPY • Go: RxGo • Groovy: RxGroovy • JRuby: RxJRuby • Kotlin: RxKotlin • Swift: RxSwift • PHP: RxPHP • Elixir: reaxive • Dart: RxDart

Slide 16

Slide 16 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | RXJAVA • Curva de aprendizado: íngreme • Não se cobre caso demore pra aprender, é um novo paradigma • Depois que você entender o conceito e entender como pensar reativo tudo ficará mais fácil

Slide 17

Slide 17 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | RXJAVA Então por que usar RxJava?

Slide 18

Slide 18 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | RXJAVA • Quando precisamos lidar com requests encadeadas / complexas • Quando precisamos trabalhar com certa complexidade nos dados (manipulação e transformação dos dados) • Quando há necessidade de executar o trabalho em threads diferentes

Slide 19

Slide 19 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | RXJAVA Para entender o RxJava é bom entendermos os seguintes elementos: • Observables • Observers • Operators

Slide 20

Slide 20 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH OBSERVABLES

Slide 21

Slide 21 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | CRIAÇÃO DE OBSERVABLE val welcomeMessage = "Hello Arctouch” val observable = Observable.just(welcomeMessage) Obsevable é o item que queremos observar • Preço de passagens • Filmes • Restaurantes • Mensagens Para criar um observable:

Slide 22

Slide 22 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | CRIAÇÃO DE OBSERVABLE val otherObservable = Observable.create(object: ObservableOnSubscribe { override fun subscribe(emitter: ObservableEmitter) { numberSequence.forEach { emitter.onNext(it) } emitter.onComplete() } })

Slide 23

Slide 23 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | CRIAÇÃO DE OBSERVABLE val myList = listOf(2, 4, 6) val newObservable = Observable.fromIterable(myList)

Slide 24

Slide 24 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | UTILIZAÇÃO DE UM OBSERVABLE JÁ CRIADO interface ApiInterface { @GET("images/search") fun searchCats(): Observable> } @Query(value = "SELECT * FROM cat”) fun getCats(): Observable> Requisições (Retrofit) Banco de dados (Room)

Slide 25

Slide 25 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH OBSERVERS

Slide 26

Slide 26 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OBSERVER Quem está observando •É o objeto que espera receber atualizações •Espera receber mudanças de estado

Slide 27

Slide 27 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | CICLO DE VIDA OnSubscribe OnNext OnComplete OnError Observable

Slide 28

Slide 28 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OBSERVER interface Observer { fun onSubscribe(@NonNull d: Disposable) fun onNext(@NonNull t: T) fun onError(@NonNull e: Throwable) fun onComplete() }

Slide 29

Slide 29 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OBSERVER public interface Consumer { void accept(T t) throws Exception; } Abstração

Slide 30

Slide 30 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | RXJAVA NA PRÁTICA val observableNumbers = Observable.just(1, 2, 3, 4) observableNumbers.subscribe(observerNumbers) val observerNumbers = object : Observer { override fun onSubscribe(d: Disposable) { } override fun onNext(t: Int) { Log.i("Log observable ", "onNext -> $t") } override fun onComplete() { Log.i("Log observable ", "completed") } override fun onError(e: Throwable) { Log.e("Log error ", "error -> $e") } } subscribed onNext -> 1 onNext -> 2 onNext -> 3 onNext -> 4 completed

Slide 31

Slide 31 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | RXJAVA NA PRÁTICA val observerNumbers = object : Observer { override fun onSubscribe(d: Disposable) { } override fun onNext(t: Int) { Log.i("Log observable ", "onNext -> $t") } override fun onComplete() { Log.i("Log observable ", "completed") } override fun onError(e: Throwable) { Log.e("Log error ", "error -> $e") } } subscribed onNext -> 1 onNext -> 2 onNext -> 3 error

Slide 32

Slide 32 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | RXJAVA NA PRÁTICA repository.getCatImages() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Consumer> { override fun accept(t: List) { onDataReady.actionOccuredPost(t) } }) ViewModel.kt repository.getCatImage() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe { onDataReady.actionOccuredPost(it) }

Slide 33

Slide 33 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH OPERADORES

Slide 34

Slide 34 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OPERADORES Características • Permitem manipular, filtrar, interagir, combinar, excluir / incluir, (…) fluxo de dados • Através do RxJava podemos manipular n vezes os dados emitidos • E o observador irá receber a informação pronta

Slide 35

Slide 35 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OPERADORES Filmes Filmes de comédia Filmes de comédia lançados em 2019 Filtro Fluxo de Dados (stream) “n" 
 transformações Resultado View Filtro Programação Reativa

Slide 36

Slide 36 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OPERADORES - JUST Observable.just("a") Marble diagram

Slide 37

Slide 37 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OPERADORES - TAKE Observable.just(1, 2, 3, 4) .take(2) .subscribe(observer) Log take: Result = 1 Log take: Result = 2

Slide 38

Slide 38 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OPERADORES - FROM ITERABLE val list = listOf(1, 2, 3) Observable.fromIterable(list)

Slide 39

Slide 39 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OPERADORES - MAP val observable = Observable.just(1, 2, 3) .map(object : Function { override fun apply(t: Int): Int { return t * 10 } }) observable.subscribe(observer) Log map: Result = 10 Log map: Result = 20 Log map: Result = 30

Slide 40

Slide 40 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OPERADORES - FILTER val observableFilter = Observable.just(2, 30, 22, 5, 60) .filter(object : Predicate { override fun test(t: Int): Boolean { return t > 10 } observableFilter.subscribe(observer) Log filter: Result = 30 Log filter: Result = 22 Log filter: Result = 60

Slide 41

Slide 41 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | COMPOSIÇÃO DE OPERADORES • Cada operador retorna um tipo que permite encadear operadores • Chamamos esta composição de stream ou chain ou cadeia • Isso permite que aplicamos uma série de operações em um determinado observable, a fim de atingirmos o que desejamos val observableTake = Observable.just(1, 2, 3, 4, 5) .take(3) .filter(object : Predicate { override fun test(t: Int): Boolean { return t < 3 } }) observableTake.subscribe(observer) Log take and filter: Result = 1 Log take and filter: Result = 2

Slide 42

Slide 42 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH FLATMAP

Slide 43

Slide 43 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | FLATMAP • Transforma itens obtidos por um observable em observables e empacota eles em um único observable • Permite encadear estruturas diferentes, porém que possuem ou agregam o mesmo propósito • As transformações consecutivas não requerem alteração no modelo ou API

Slide 44

Slide 44 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | FLATMAP

Slide 45

Slide 45 text

O GUIA DO APRENDIZADO X repository.getCachedCategories() .map { categoriesList: List -> categoriesList.first() } .flatMap { category: Category -> repository.getCatImages(“100", category) } .filter { catImage: CatImage -> !catImage.categories.isNullOrEmpty() } .toList() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ result: MutableList -> if (result.isNotEmpty()) { onDataReady.actionOccuredPost(result) } } .flatMap { catsImageList: List -> Observable.fromIterable(catsImageList) } [ ] , , , [ ] , [ ] , 1 2 3 4 5 6 7

Slide 46

Slide 46 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH THREADS

Slide 47

Slide 47 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | PROGRAMAÇÃO REATIVA • RxJava permite trocar de thread facilmente • São utilizados os operadores SubscribeOn e ObserveOn para fazer este trabalho

Slide 48

Slide 48 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH SUBSCRIBE ON

Slide 49

Slide 49 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | SUBSCRIBE ON • Recebe um scheduler como parâmetro e retorna um observable (permitindo que façamos chain com eles também) • Representa em qual thread queremos que o observable esteja quando for inscrito (quando o subscribe for chamado) • Sua ordem na chain é indiferente • Schedulers: • Computation - operações, cálculos • Io - operações network e acesso a banco de dados • Single - roda tudo numa única thread • Trampoline - roda na thread atual / execução siga uma ordem • (…)

Slide 50

Slide 50 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | SUBSCRIBE ON Observable.just("Hello:") .concatMap { Observable.just(it + " RxJava is awesome") } .subscribeOn(Schedulers.computation()) .subscribe { Log.i("Log subscribeOn", "Result $it") } Observable.just("Hello:") .subscribeOn(Schedulers.computation()) .concatMap { Observable.just(it + " RxJava is awesome") } .subscribe { Log.i("Log subscribeOn", "Result $it") }

Slide 51

Slide 51 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH OBSERVE ON

Slide 52

Slide 52 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OBSERVE ON • Permite facilmente mover o trabalho executado entre diferentes threads • Diferente do subscribeOn, a ordem dos ObserveOn altera a thread em que o código será executado • Tudo que estiver abaixo do observeOn será executado na Thread indicada Observable.just("Hello:") .subscribeOn(Schedulers.computation()) .operador_1() {código A} .operador_2() {código B} .observeOn(schedulers.io()) .operador_3() {código C} .operador_4() {código D} .observeOn(schedulers.single()) .operador_5() {código E} .observeOn(AndroidSchedulers.mainThread()) .subscribe { Log.i("Log observeOn”, "Result $it") } Código Thread A e B Computation C e D IO E Single RESULTADO Main Thread

Slide 53

Slide 53 text

O GUIA DO APRENDIZADO X RX JAVA FROM SCRATCH DISPOSABLES

Slide 54

Slide 54 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | DISPOSABLES • Interface que permite parar de ouvir as emissões, e assim liberando qualquer recurso que esteja sendo segurado. Possui um método chamado dispose() • O Disposable tem o poder de dizer para a aplicação: “Olha agora não preciso mais deste processo" • Se não chamamos o método dispose() permitimos (em alguns casos) que o processo não termine, podendo causar memory leaks • CompositeDisposable - é um objeto que armazena e manipula disposables

Slide 55

Slide 55 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | DISPOSABLE catsDisposable = repository.getCatImages() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map { it.first() } .subscribe { t -> actionOnFluffyReady.actionOccuredPost(t) } catsDisposable?.let { compositeDisposable.add(it) } override fun onCleared() { compositeDisposable.clear() super.onCleared() }

Slide 56

Slide 56 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | INDICAÇÃO PARA PRÓXIMOS ESTUDOS • Quando, como e Onde usar RxJava? • Requests que tragam certa complexidade • Quando precisamos unir dados de uma request: exemplo filmes + gênero • Quando precisamos mover o trabalho realizado entre threads • Quando precisamos trabalhar com certa complexidade nos dados • Quando precisamos manipular o dado a ponto que seja muito complexo fazê-lo de outra forma • Não mate uma formiga com uma bazuca • Considere utilizar Kotlin Coroutines para • chamadas simples • Trabalhos menos complexos executados em outras threads • Processamento de streams

Slide 57

Slide 57 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | INDICAÇÃO PARA PRÓXIMOS ESTUDOS • Diferentes tipos de Emissores (Observables) • Single • Maybe • Completable • Flowable • Diferentes operadores para cada situação: • Sugestão de Operadores: • CombineLatest, Zip, Merge (combinação - exemplo: combinar requests) • Concat, Delay (úteis - exemplo: concatenar, adicionar delay na emissão) • Defer, Debounce (criação - exemplo: click de botões, pesquisas por caracter) • Subjects: Publish, Behavior, Replay, Async • Customização de Schedulers

Slide 58

Slide 58 text

O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | LINKS ÚTEIS • RxJava with Kotlin in Baby Steps - Annyce Davis - KotlinConf 2017
 https://www.youtube.com/watch?v=YPf6AYDaYf8&t= • Rx documentação oficial
 http://reactivex.io/ • RxJava tutorial (Java)
 https://proandroiddev.com/exploring-rxjava-in-android-e52ed7ef32e2 • Exploring RxJava 2 for Android - Jake Wharton
 https://www.youtube.com/watch?v=htIXKI5gOQU • RxJava e RxAndroid playlist (CodingWithMitch)
 https://www.youtube.com/playlist?list=PLgCYzUzKIBE-8wE9Sv3yzYZlo70PBmFPz • Exemplo no GitHub: 
 http://github.com/paulacr/RxJavaFromScratch

Slide 59

Slide 59 text

O GUIA DO APRENDIZADO X Paula Rosa • @_paulacr • https://medium.com/@Paula.Rosa • [email protected] • https://www.linkedin.com/in/paularosa/ • [email protected] (vagas) https://speakerdeck.com/paulacr/rxjava-from-scratch