35
1 1 REACTIVE PROGRAMMING NO ANDROID Guilherme Branco Software Engineer Guilherme Pereira Branco @guipbranco

Reactive Programming no Android

Embed Size (px)

Citation preview

Page 1: Reactive Programming no Android

11

REACTIVE PROGRAMMING NO ANDROIDGuilherme BrancoSoftware Engineer

Guilherme Pereira Branco

@guipbranco

Page 2: Reactive Programming no Android

22

REACTIVE PROGRAMMING NO ANDROIDGuilherme BrancoSoftware Engineer

Guilherme Pereira Branco

@guipbranco

Page 3: Reactive Programming no Android

Reactive Programming é do balacobaco!

Quem não usa está por fora, meu!

Sou deveras experiente em RxJava!

Page 4: Reactive Programming no Android
Page 5: Reactive Programming no Android

55

RxJava RxAndroid

Page 6: Reactive Programming no Android

66

Reactive Programming | O Que é?

• Pull x Push: Ao invés de pedir algo e esperar, o desenvolvedor simplesmente pede por algo e é notificado quando o resultado estiver disponível.

• Paradigma baseado no conceito de fluxo de dados assíncrono.

• Mais flexível. O Desenvolvedor ignora se os dados chegam de forma síncrona ou assíncrona. O código simplesmente funciona.

• Fontes de dados podem ser combinadas e não aninhadas, afastando o desenvolvedor do “callback hell”

Page 7: Reactive Programming no Android

77

Flux

o

Observable ObserverEmite

item1

item2

item3

Manipula item 1

Manipula item 2

Manipula item 3

onNext(item1)

onNext(item2)

onNext(item3)

Itens acabaram onCompleted() completar

Ops! Erro… onError(error) Trata erro

Reactive Programming | Fluxo

Page 8: Reactive Programming no Android
Page 9: Reactive Programming no Android

99

Anatomia | Principal Construção

Observable.from(lectureService.getLectures()) 1. Observable

.subcribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) 3. Schedulers

.subscribe(getObserver()) 2. Observer

Page 10: Reactive Programming no Android

1010

public interface LectureService {

List<Lecture> getLectures();

}

Anatomia | Principal Construção

Observable.from(lectureService.getLectures()) 1. Observable

Page 11: Reactive Programming no Android

1111

Anatomia | Principal Construção

Observable.from(lectureService.getLectures()) 1. Observable

.subcribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) 3. Schedulers

.subscribe(getObserver()) 2. Observer

Page 12: Reactive Programming no Android

1212

Anatomia | Observer / Subscriber

private Observer<Lecture> getObserver(){return new Observer<Lecture>() {

@Override public void onCompleted() { Log.e(TAG, "onCompleted"); }

@Override public void onError(Throwable e) { Log.e(TAG, "onError: " + e.getMessage()); }

@Override public void onNext(Lecture lecture){ Log.e(TAG, "onNext");

}});

.subscribe(getObserver()) 2. Observer

Page 13: Reactive Programming no Android

1313

Anatomia | Principal Construção

Observable.from(lectureService.getLectures()) 1. Observable

.subcribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) 3. Schedulers

.subscribe(getObserver()) 2. Observer

ObserverObservable=

4. Subscription

Page 14: Reactive Programming no Android

1414

Anatomia | Principal Construção

.subcribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(getObserver())

Observable<Lecture> observable = Observable.from(lectureService.getLectures());

observableSubscription subscription =

1. subscription.unsubscribe()

2. CompositeSubscription compSubscription;compSubscription.add(subscription);

3. compSubscription.unsubscribe()

Page 15: Reactive Programming no Android

1515

Exemplo | TDC

Page 16: Reactive Programming no Android

1616

public interface LectureService {

List<Lecture> getLectures();

}

Exemplo | AsyncTask

Page 17: Reactive Programming no Android

1717

new LectureAsyncTask().execute();

private class LectureAsyncTask extends AsyncTask<String, Void, List<Lecture>>{

@Override protected void onPreExecute() { showLoading(); }

@Override protected List<Lecture> doInBackground(String... params){ return lectureService.getLectures(); }

@Override protected void onPostExecute(List<Lecture> lectures){ hideLoading(); renderItems(lectures); } }

Anatomia | AsyncTask -> Reactive

Page 18: Reactive Programming no Android

1818

new LectureAsyncTask().execute();

private class LectureAsyncTask extends AsyncTask<String, Void, List<Lecture>>{

@Override protected void onPreExecute() { showLoading(); }

@Override protected List<Lecture> doInBackground(String... params){ return lectureService.getLectures(); }

@Override protected void onPostExecute(List<Lecture> lectures){ hideLoading(); renderItems(lectures); } }

Anatomia | AsyncTask -> Reactive

Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io()) .toList()

Page 19: Reactive Programming no Android

1919

Anatomia | AsyncTask -> Reactive

Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io()) .toList()

Page 20: Reactive Programming no Android

2020

new LectureAsyncTask().execute();

private class LectureAsyncTask extends AsyncTask<String, Void, List<Lecture>>{

@Override protected void onPreExecute() { showLoading(); }

@Override protected List<Lecture> doInBackground(String... params){ return lectureService.getLectures(); }

@Override protected void onPostExecute(List<Lecture> lectures){ hideLoading(); renderItems(lectures); } }

Anatomia | AsyncTask -> Reactive

Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io())

.subscribe( new Subscriber<List<Lecture>>() { @Override public void onCompleted() { hideLoading(); }

@Override public void onError(Throwable e) { Log.e(TAG, "onError: " + e.getMessage()); }

@Override public void onNext(List<Lecture> lectures){ renderItems(lectures); } });

.toList()

Page 21: Reactive Programming no Android

2121

Anatomia | AsyncTask -> Reactive

.subscribe( new Subscriber<List<Lecture>>() { @Override public void onCompleted() { hideLoading(); }

@Override public void onError(Throwable e) { Log.e(TAG, "onError: " + e.getMessage()); }

@Override public void onNext(List<Lecture> lectures){ renderItems(lectures); } });

Page 22: Reactive Programming no Android

2222

new LectureAsyncTask().execute();

private class LectureAsyncTask extends AsyncTask<String, Void, List<Lecture>>{

@Override protected void onPreExecute() { showLoading(); }

@Override protected List<Lecture> doInBackground(String... params){ return lectureService.getLectures(); }

@Override protected void onPostExecute(List<Lecture> lectures){ hideLoading(); renderItems(lectures); } }

Anatomia | AsyncTask -> Reactive

.subscribe( new Subscriber<List<Lecture>>() { @Override public void onCompleted() { hideLoading(); }

@Override public void onError(Throwable e) { Log.e(TAG, "onError: " + e.getMessage()); }

@Override public void onNext(List<Lecture> lectures){ renderItems(lectures); } });

Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io()) .toList()

Page 23: Reactive Programming no Android

2323

Exemplo | AsyncTask -> Reactive

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Page 24: Reactive Programming no Android

2424

new LectureAsyncTask().execute();

private class LectureAsyncTask extends AsyncTask<String, Void, List<Lecture>>{

@Override protected void onPreExecute() { showLoading(); }

@Override protected List<Lecture> doInBackground(String... params){ return lectureService.getLectures(); }

@Override protected void onPostExecute(List<Lecture> lectures){ hideLoading(); renderItems(lectures); } }

Exemplo | AsyncTask -> Reactive

.subscribe( new Subscriber<List<Lecture>>() { @Override public void onCompleted() { hideLoading(); }

@Override public void onError(Throwable e) { Log.e(TAG, "onError: " + e.getMessage()); }

@Override public void onNext(List<Lecture> lectures){ renderItems(lectures); } });

.toList()

Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io())

Page 25: Reactive Programming no Android

2525

Exemplo | AsyncTask -> Reactive

.subscribe( new Subscriber<List<Lecture>>() { @Override public void onCompleted() { hideLoading(); }

@Override public void onError(Throwable e) { Log.e(TAG, "onError: " + e.getMessage()); }

@Override public void onNext(List<Lecture> lectures){ renderItems(lectures); } });

.observeOn(AndroidSchedulers.mainThread())

Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io())

.toList()

Page 26: Reactive Programming no Android

2626

Exemplo | RxJava

.subscribe(new Subscriber(){…});

.observeOn(AndroidSchedulers.mainThread())

Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io())

.toList()

Page 27: Reactive Programming no Android

2727

Exemplo | TDC

Page 28: Reactive Programming no Android

2828

.subscribe(new Subscriber(){…});

.observeOn(AndroidSchedulers.mainThread())

Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io())

.toList()

Exemplo | RxJava

Page 29: Reactive Programming no Android

2929

Operator | Filter

.filter(new Func1<Lecture, Boolean>() { @Override public Boolean call(Lecture lecture) { return lecture.getDay().equalsIgnoreCase(day); }})

.subscribe(new Subscriber(){…});

.observeOn(AndroidSchedulers.mainThread())

Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io())

.toList()

Page 30: Reactive Programming no Android

3030

Exemplo | TDC

Page 31: Reactive Programming no Android

3131

Exemplo | TDC

Page 32: Reactive Programming no Android

3232

Observable<Lecture> observable = getLectures();

.map(new Func1<Lecture, String>() { @Override public String call(Lecture lecture) { return lecture.getDay(); }}) // Observable<String>

.cast(CharSequence.class) // Observable<CharSequence>

Operator | Map, Cast, Distinct…

.distinct() // Mesmo Observable sem dados repetidos

.toList() // Observable<List<CharSequence>>

.subscribe(new Subscriber(){…});

observable

Page 33: Reactive Programming no Android

3333

Reactive Programming | Links

https://github.com/ReactiveX/RxJava

https://www.packtpub.com/application-development/rxjava-essentials

http://rxmarbles.com

Page 34: Reactive Programming no Android

34

http://github.com/gpbranco/rx-example-tdc

Page 35: Reactive Programming no Android

OBRIGADO.

Big Brains WantedJoin our team! Go to arctouch.com/brjobs

Visit our booth to win an Apple Watch.