reactive programming no android
TRANSCRIPT
11
REACTIVE PROGRAMMING NO ANDROIDGuilherme BrancoSoftware Engineer
Guilherme Pereira Branco
@guipbranco
22
REACTIVE PROGRAMMING NO ANDROIDGuilherme BrancoSoftware Engineer
Guilherme Pereira Branco
@guipbranco
Reactive Programming é do balacobaco!
Quem não usa está por fora, meu!
Sou deveras experiente em RxJava!
55
RxJava RxAndroid
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”
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
99
Anatomia | Principal Construção
Observable.from(lectureService.getLectures()) 1. Observable
.subcribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) 3. Schedulers
.subscribe(getObserver()) 2. Observer
1010
public interface LectureService {
List<Lecture> getLectures();
}
Anatomia | Principal Construção
Observable.from(lectureService.getLectures()) 1. Observable
1111
Anatomia | Principal Construção
Observable.from(lectureService.getLectures()) 1. Observable
.subcribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) 3. Schedulers
.subscribe(getObserver()) 2. Observer
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
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
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()
1515
Exemplo | TDC
1616
public interface LectureService {
List<Lecture> getLectures();
}
Exemplo | AsyncTask
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
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()
1919
Anatomia | AsyncTask -> Reactive
Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io()) .toList()
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()
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); } });
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()
2323
Exemplo | AsyncTask -> Reactive
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
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())
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()
2626
Exemplo | RxJava
.subscribe(new Subscriber(){…});
.observeOn(AndroidSchedulers.mainThread())
Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io())
.toList()
2727
Exemplo | TDC
2828
.subscribe(new Subscriber(){…});
.observeOn(AndroidSchedulers.mainThread())
Observable.from(lectureService.getLectures()) .doOnSubscribe(showLoading()) .subscribeOn(Schedulers.io())
.toList()
Exemplo | RxJava
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()
3030
Exemplo | TDC
3131
Exemplo | TDC
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
3333
Reactive Programming | Links
https://github.com/ReactiveX/RxJava
https://www.packtpub.com/application-development/rxjava-essentials
http://rxmarbles.com
OBRIGADO.
Big Brains WantedJoin our team! Go to arctouch.com/brjobs
Visit our booth to win an Apple Watch.