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

RxJava from Scratch

RxJava from Scratch

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

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