rxjava - programação assíncrona para android

48
RxJava Um pouco sobre programação assíncrona e streams 1

Upload: clerton-leal

Post on 20-Jan-2017

159 views

Category:

Mobile


6 download

TRANSCRIPT

Page 1: RxJava - Programação assíncrona para Android

RxJavaUm pouco sobre programação assíncrona e streams

1

Page 2: RxJava - Programação assíncrona para Android

O objetivo dessa apresentação é mostrar um pouco do poder do

RxJava o porque dele ser incrível

2

Page 3: RxJava - Programação assíncrona para Android

Quem sou eu• Clêrton Leal

• Nascido e criado em Fortaleza

• Vivendo em Belo Horizonte a pouco mais de 2 meses

• Atualmente trabalhando como consultor para Avenue Code

3

Page 4: RxJava - Programação assíncrona para Android

Um pouco de históriaSerá rápido eu prometo =)

4

Page 5: RxJava - Programação assíncrona para Android

Reactive Extensions é uma biblioteca, de programação orientada a eventos, desenvolvida pela Microsoft e liberada para o .NET framework em 2011.

Implementa e extende o padrão Observable clássico, porem com um tratamento mais refinado para threads.

5

Page 6: RxJava - Programação assíncrona para Android

Em 2012 a Netflix adota o uso de Reactive Extensions para seus módulos escritos em .NET e fica surpresa com a facilidade de programação assíncrona.

Em 2013 a Netflix libera um projeto open source chamado RxJava, uma implementação da especificação RX para Java. Possibilitando assim o uso de RX em todos os seus módulos escritos em Java e Scala.

6

Page 7: RxJava - Programação assíncrona para Android

Linguagems

7

Page 8: RxJava - Programação assíncrona para Android

• Java: RxJava

• JavaScript: RxJS

• C#: Rx.NET

• C#(Unity): UniRx

• Scala: RxScala

• Clojure: RxClojure

• C++: RxCpp

8

Page 9: RxJava - Programação assíncrona para Android

• Ruby: Rx.rb

• Python: RxPY

• Groovy: RxGroovy

• JRuby: RxJRuby

• Kotlin: RxKotlin

• Swift: RxSwift

• PHP: RxPHP

9

Page 10: RxJava - Programação assíncrona para Android

Uma sintaxe única para todas as linguagens

10

Page 11: RxJava - Programação assíncrona para Android

RxJavaObservable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> observer) { try { for (int i = 1; i < 5; i++) { observer.onNext(i); } observer.onCompleted(); } catch (Exception e) { observer.onError(e); } } } );

11

Page 12: RxJava - Programação assíncrona para Android

RxGroovydef myObservable = Observable.create({ aSubscriber -> try { for (int i = 1; i < 5; i++) { aSubscriber.onNext(i); }

aSubscriber.onCompleted(); } catch(Throwable t) { aSubscriber.onError(t); }})

12

Page 13: RxJava - Programação assíncrona para Android

RxSwiftlet source = Observable.create { observer in do { for i in 1...5 { observer.on(.Next(i)) }

observer.on(.Completed) } catch { observer.on(.Error) }}

13

Page 14: RxJava - Programação assíncrona para Android

Qual a grande jogada do RxJava

14

Page 15: RxJava - Programação assíncrona para Android

15

Page 16: RxJava - Programação assíncrona para Android

RX trás a união e expansão de dois

padrões de projeto

16

Page 17: RxJava - Programação assíncrona para Android

Observable

17

Page 18: RxJava - Programação assíncrona para Android

Iterator

18

Page 19: RxJava - Programação assíncrona para Android

Observable extendido

19

Page 20: RxJava - Programação assíncrona para Android

Adicionando a isso funções de

transformação e tratamento

assíncrono de dados20

Page 21: RxJava - Programação assíncrona para Android

Entre o Observable e o Subscriber

podemos aplicar diversas funções de

transformação21

Page 22: RxJava - Programação assíncrona para Android

Um pequeno disclaimer sobre Java

8

22

Page 23: RxJava - Programação assíncrona para Android

Aplicando um filtroString[] search = {"google", "microsoft"};

Observable.from(search) .filter(s -> s.contains("g")) .subscribe(s -> { Log.d(TAG, s);});

23

Page 24: RxJava - Programação assíncrona para Android

24

Page 25: RxJava - Programação assíncrona para Android

Vamos adicionar o controle de threads

25

Page 26: RxJava - Programação assíncrona para Android

String[] search = {"google", "microsoft"};

Observable.from(search) .filter(s -> complexAndSlowFilter(s)) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(s -> { Log.d(TAG, s);});

26

Page 27: RxJava - Programação assíncrona para Android

Schedulers• Schedulers.computation() - Usado para ações em CPU

bound em multi thread.

• Schedulers.io() - Usado para ações em IO bound.

• Schedulers.newThread() - Execução em nova thread.

• Schedulers.immediate() - Execução na thread atual.

• Schedulers.trampoline() - Execução na thread atual, mas apenas após outras ações enfileiradas.

27

Page 28: RxJava - Programação assíncrona para Android

SchedulersAndroidSchedulers.mainThread() Main thread de uma aplicação Android.

28

Page 29: RxJava - Programação assíncrona para Android

Vamos para um exemplo pratico

29

Page 30: RxJava - Programação assíncrona para Android

Em quantas linhas?

• Campo de texto irá buscar em um serviço web

• Buscas feitas apenas com pelo menos 3 caracteres

• Buscas feitas apenas quando o usuário passar 500 milissegundos sem digitar

30

Page 31: RxJava - Programação assíncrona para Android

Precisamos criar um observable do SearchViewpublic Observable<String> getSearchObservable(SearchView searchView) { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; }

@Override public boolean onQueryTextChange(String newText) { subscriber.onNext(newText); return true; } }); } }); }

31

Page 32: RxJava - Programação assíncrona para Android

E depois aplicar algumas transformaçõespublic Observable<String> getSearchObservable(SearchView searchView) { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; }

@Override public boolean onQueryTextChange(String newText) { subscriber.onNext(newText); return true; } }); } }).filter(s -> fragment != null) .map(s -> "http://search.com.br/" + s) .filter(s -> s.length() >= 3) .debounce(500, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.computation());

32

Page 33: RxJava - Programação assíncrona para Android

E apenas isso na sua camada de visãogetSearchObservable(searchField).subscribe(s -> { doRequest(); })

33

Page 34: RxJava - Programação assíncrona para Android

Vamos ver alguns truques legais com

RxJava

34

Page 35: RxJava - Programação assíncrona para Android

Facil de cancelar• Sempre que chamamos o método subscribe(), o retorno do

mesmo é uma Subscription.

• Uma subscription pode ser facilmente cancelada.Subscription subscription = getSearchObservable(searchField).subscribe(s -> { doRequest();});

subscription.unsubscribe();

35

Page 36: RxJava - Programação assíncrona para Android

Morte a AsyncTask

36

Page 37: RxJava - Programação assíncrona para Android

AsyncTasks são tóxicas para o seu

código.

37

Page 38: RxJava - Programação assíncrona para Android

AsyncTask<String, String, User> asyncTask = new AsyncTask<String, String, User>() { @Override protected void onPreExecute() { // Show a progress dialog }

@Override protected User doInBackground(String... params) { return getUserSync(params[0]); }

@Override protected void onPostExecute(User s) { // Update the UI }

@Override protected void onProgressUpdate(String... values) { // Notify progress }};

38

Page 39: RxJava - Programação assíncrona para Android

Método getUserpublic Observable<User> getUser(String name) { return Observable.create((Observable.OnSubscribe<User>) subscriber -> { try { User user = getUserSync(name); subscriber.onNext(user); subscriber.onCompleted(); } catch (IOException e) { subscriber.onError(e); } }).subscribeOn(Schedulers.io());}

39

Page 40: RxJava - Programação assíncrona para Android

Consumindo getUserprivate void doRequest() { getUser("José") .observeOn(AndroidSchedulers.mainThread()) .subscribe(user -> { updateUi(user); }, throwable -> { handleError(throwable); });}

40

Page 41: RxJava - Programação assíncrona para Android

Ou apenas use o Retrofit@GET("/{name}")Observable<User> getUser(@Path("name") String name);

41

Page 42: RxJava - Programação assíncrona para Android

Morte a TimerTask

42

Page 43: RxJava - Programação assíncrona para Android

Um timer simples com RxJavaSubscription subscription = Observable.timer(START_DELAY, POLL_INTERVAL, TimeUnit.SECONDS) .subscribe(aLong -> { Log.d(TAG, String.valueOf(aLong)); });

subscription.unsubscribe();

43

Page 44: RxJava - Programação assíncrona para Android

A simplicidade de fazer tarefas de forma assíncrona abre novas

possibilidades44

Page 45: RxJava - Programação assíncrona para Android

Qualquer operação de IO deve ser realizada em uma thread

separada. Isso inclui acesso a banco de dados e

SharedPreferences

45

Page 46: RxJava - Programação assíncrona para Android

O maior motivo se adotar RxJava é o

suporte da comunidade

46

Page 47: RxJava - Programação assíncrona para Android

Existem muitas bibliotecas com Suporte a RxJava• Retrofit: https://github.com/square/retrofit

• RxBinding: https://github.com/JakeWharton/RxBinding

• SqlBrite: https://github.com/square/sqlbrite

• Rx-preferences: https://github.com/f2prateek/rx-preferences

47

Page 48: RxJava - Programação assíncrona para Android

Obrigado =)Contatos

[email protected]

• clertonleal

48