Slide 1

Slide 1 text

ANDROID + SCALA + RXJAVA Programação Reativa Funcional

Slide 2

Slide 2 text

ANDROID + SCALA? • Como eu faço isso? Explicações aqui: • https://www.youtube.com/watch?v=ZoYJidA7nIw • http://www.slideshare.net/andreluizcarvalho/scala-no-android

Slide 3

Slide 3 text

RXJAVA? “Programação Reativa Funcional para a JVM” github.com/netflix/rxjava

Slide 4

Slide 4 text

POR QUE?

Slide 5

Slide 5 text

EVENTOS & SERVIÇOS REMOTOS • Tudo o que acontece em UI é evento • Eventos do sistema, mensagens, notificações push • Os dados estão na “nuvem” • Acesso local em banco também tem custo • Um só modelo de evento / execução assíncrona

Slide 6

Slide 6 text

FRP FTW! • Estilo de programação de maneira declarativa e assíncrona • Tratar eventos como a observação de uma sequência • Tratamento de erros mais amigáveis • Composição!

Slide 7

Slide 7 text

ANDROID ON STEROIDS • Como transformar os eventos do Android em Observables? • Podemos usar Java • Conversões implícitas para Scala

Slide 8

Slide 8 text

EVENTOS DO ANDROID public static Observable click(View view) { final PublishSubject subject = PublishSubject.create(); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { subject.onNext(new Object()); } }); return subject.asObservable(); } View Click PublishSubject: observer só receberá os eventos que acontecerem depois da inscrição.

Slide 9

Slide 9 text

EVENTOS DO ANDROID public static Observable text(TextView view) { String currentText = String.valueOf(view.getText()); final BehaviorSubject subject = BehaviorSubject.create(currentText); view.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged( CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged( CharSequence charSequence, int i, int i2, int i3) { } @Override public void afterTextChanged(Editable editable) { subject.onNext(editable.toString()); } }); return subject.asObservable(); } TextView text changed BehaviorSubject: observer receberá o último evento antes da inscrição e todos os próximos

Slide 10

Slide 10 text

EVENTOS DO ANDROID Operação de IO: Serviços Web ReplaySubject: observer receberá todos os eventos ocorridos antes da inscrição e todos os próximos Dica: use o Retrofit, que já suporta o RxJava github.com/square/retrofit

Slide 11

Slide 11 text

PROPRIEDADES DO ANDROID static public Observer text(final TextView view) { return new Observer() { @Override public void onCompleted() {} @Override public void onError(Throwable e) {} @Override public void onNext(String text) { view.setText(text); } }; } TextView text

Slide 12

Slide 12 text

EXEMPLO Banner Entrada de texto Contagem Botão de ação

Slide 13

Slide 13 text

EXEMPLO val messageField = find[EditText](R.id.message) val charCountLabel = find[TextView](R.id.char_count) ! val message: Observable[String] = Events.text(messageField) val charCountObserver = Properties.text(charCountLabel) ! val count = message.map(str => str.length) count.map(n => n.toString).subscribe(charCountObserver) Contagem do texto

Slide 14

Slide 14 text

EXEMPLO val sendButton = find[Button](R.id.send) count.map(_ > 0).subscribe(enabled => sendButton.setEnabled(enabled)) val sendClicked = Events.click(sendButton) Habilitando o botão de ação Ação do botão message.combineLatest(sendClicked).subscribe { textAndObject => startActivity(new Intent(Intent.ACTION_VIEW, "http://www.google.com/search?q="+textAndObject._1)) }

Slide 15

Slide 15 text

EXEMPLO DE SERVIÇO: BANNER

Slide 16

Slide 16 text

PUT YOUR HANS ON CODE! github.com/pinuts-studios/android-scala-rxjava

Slide 17

Slide 17 text

OBRIGADO!

Slide 18

Slide 18 text

PERGUNTAS? Quer trabalhar com scala? Fale comigo! André Luiz Carvalho [email protected] @alcarv RH da Pinuts [email protected]