Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RxJava from Scratch

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

RxJava from Scratch

This presentation will help you to understand the RxJava through the Observer Pattern understanding, which is a base for understanding RxJava.

Avatar for Paula Rosa

Paula Rosa

April 24, 2019
Tweet

More Decks by Paula Rosa

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OBSERVER

    PATTERN - OBSERVABLE interface FlightObservable { fun registerObserver(observable: FlightObserver) fun removeObserver(observable: FlightObserver) }
  7. 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) } }
  8. O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OBSERVER

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

    PATTERN - OBSERVER class MainViewModel: ViewModel(), FlightObserver { override fun onPriceChanged(flightNumber: String, price: String) { //Notify user } }
  10. 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
  11. 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
  12. 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
  13. O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | RXJAVA

    Para entender o RxJava é bom entendermos os seguintes elementos: • Observables • Observers • Operators
  14. 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:
  15. O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | CRIAÇÃO

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

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

    DE UM OBSERVABLE JÁ CRIADO interface ApiInterface { @GET("images/search") fun searchCats(): Observable<List<Cat>> } @Query(value = "SELECT * FROM cat”) fun getCats(): Observable<List<Cat>> Requisições (Retrofit) Banco de dados (Room)
  18. 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
  19. O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | CICLO

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

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

    public interface Consumer<T> { void accept(T t) throws Exception; } Abstração
  22. 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<Int> { 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
  23. O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | RXJAVA

    NA PRÁTICA val observerNumbers = object : Observer<Int> { 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
  24. O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | RXJAVA

    NA PRÁTICA repository.getCatImages() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Consumer<List<CatImage>> { override fun accept(t: List<CatImage>) { onDataReady.actionOccuredPost(t) } }) ViewModel.kt repository.getCatImage() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe { onDataReady.actionOccuredPost(it) }
  25. 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
  26. 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
  27. O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OPERADORES

    - JUST Observable.just("a") Marble diagram
  28. 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
  29. O GUIA DO APRENDIZADO X RXJAVA FROM SCRATCH | OPERADORES

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

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

    - FILTER val observableFilter = Observable.just(2, 30, 22, 5, 60) .filter(object : Predicate<Int> { override fun test(t: Int): Boolean { return t > 10 } observableFilter.subscribe(observer) Log filter: Result = 30 Log filter: Result = 22 Log filter: Result = 60
  32. 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<Int> { override fun test(t: Int): Boolean { return t < 3 } }) observableTake.subscribe(observer) Log take and filter: Result = 1 Log take and filter: Result = 2
  33. 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
  34. O GUIA DO APRENDIZADO X repository.getCachedCategories() .map { categoriesList: List<Category>

    -> 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<CatImage> -> if (result.isNotEmpty()) { onDataReady.actionOccuredPost(result) } } .flatMap { catsImageList: List<CatImage> -> Observable.fromIterable(catsImageList) } [ ] , , , [ ] , [ ] , 1 2 3 4 5 6 7
  35. 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
  36. 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 • (…)
  37. 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") }
  38. 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
  39. 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
  40. 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() }
  41. 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
  42. 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
  43. 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
  44. 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