Introduction to rx java for android
-
Upload
esa-firman -
Category
Software
-
view
645 -
download
1
Transcript of Introduction to rx java for android
![Page 1: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/1.jpg)
Introduction to RxJava for Android
Esa Firman
![Page 2: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/2.jpg)
What is RxJava?RxJava is a Java VM implementation of ReactiveX (Reactive Extensions): a library for composing asynchronous and event-based programs by using observable sequences
See also: 2 minutes introduction to Rxhttps://medium.com/@andrestaltz/2-minute-introduction-to-rx-24c8ca793877#.rwup8ee0s
![Page 3: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/3.jpg)
The ProblemHow to deal with execution
context ?
![Page 4: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/4.jpg)
ThreadsHandler handler = new Handler(Looper.getMainLooper()); new Thread(){ @Override public void run() { final String result = doHeavyTask(); handler.post(new Runnable() { // or runUIThread on Activity @Override public void run() { showResult(result); } }); } }.start();
![Page 5: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/5.jpg)
ThreadsPros:- Simple Cons:- Hard way to deliver results in UI thread- Pyramid of Doom
![Page 6: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/6.jpg)
AsyncTasknew AsyncTask<Void, Integer, String>(){ @Override protected String doInBackground(Void... params) { return doHeavyTask(); } @Override protected void onPostExecute(String s) { showResult(s); } }.execute();
![Page 7: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/7.jpg)
AsyncTaskPros:
- Deal with main threadCons:
- Hard way to handling error- Not bound to activity/fragment lifecycle- Not composable - Nested AsyncTask- “Antek Async”
![Page 8: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/8.jpg)
Why Rx?- Because multithreading is hard- Execution context- Powerful operators- Composable- No Callback Hell- Etc ...
![Page 9: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/9.jpg)
The BasicThe basic building blocks of reactive code are Observables and Subscribers. An Observable emits items; a Subscriber consumes those items.
The smallest building block is actually an Observer, but in practice you are most often using Subscriber because that's how you hook up to Observables.
![Page 10: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/10.jpg)
The BasicObservables often don't start emitting items until someone explicitly subscribes to them
![Page 11: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/11.jpg)
Enough talk, let’s see some code ...
![Page 12: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/12.jpg)
Hello Worldpublic Observable<String> getStrings() { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { try { subscriber.onNext("Hello, World"); subscriber.onCompleted(); } catch (Exception ex) { subscriber.onError(ex); } } });}
![Page 13: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/13.jpg)
Hello WorldgetStrings().subscribe(new Subscriber(){
@Override public void onCompleted() {
// no - op} @Overridepublic void onError(Throwable e) {
e.printStackTrace();} @Override public void onNext(String s) {
System.out.println(s);}
};
![Page 14: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/14.jpg)
Observable<String> myObservable = Observable.just("Hello, world!");
Action1<String> onNextAction = new Action1<>() { @Override public void call(String s) { System.out.println(s); }};
myObservable.subscribe(onNextAction);// Outputs "Hello, world!"
Simpler Code
![Page 15: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/15.jpg)
Simplest* Code - Using LambdaObservable.just("Hello, World").subscribe(System.out::println);
*AFAIK
![Page 16: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/16.jpg)
Observable CreationObservable.create(Observable.onSubscribe) from( ) — convert an Iterable or a Future or single value into an Observablerepeat( ) — create an Observable that emits a particular item or sequence of items repeatedly timer( ) — create an Observable that emits a single item after a given delayempty( ) — create an Observable that emits nothing and then completeserror( ) — create an Observable that emits nothing and then signals an errornever( ) — create an Observable that emits nothing at all
![Page 17: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/17.jpg)
Operators
![Page 18: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/18.jpg)
Filtering Operators- filter( ) — filter items emitted by an Observable- takeLast( ) — only emit the last n items emitted by an Observable- takeLastBuffer( ) — emit the last n items emitted by an Observable, as a single list item- skip( ) — ignore the first n items emitted by an Observable- take( ) — emit only the first n items emitted by an Observable- first( ) — emit only the first item emitted by an Observable, or the first item that meets some condition- elementAt( ) — emit item n emitted by the source Observable- timeout( ) — emit items from a source Observable, but issue an exception if no item is emitted in a
specified timespan- distinct( ) — suppress duplicate items emitted by the source Observable
![Page 19: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/19.jpg)
![Page 20: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/20.jpg)
FilterObservable.just("Esa", "Ganteng", "Jelek")
.filter(s -> !s.equalsIgnoreCase("jelek"))
.buffer(2)
.subscribe(strings -> {
print(strings.get(0) + “ “ +
strings.get(1));
});
// print Esa Ganteng
![Page 21: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/21.jpg)
Transformation Operators- map( ) — transform the items emitted by an Observable by applying a function to each of them - flatMap( ) — transform the items emitted by an Observable into Observables, then flatten this into a
single Observable - scan( ) — apply a function to each item emitted by an Observable, sequentially, and emit each
successive value - groupBy( ) and groupByUntil( ) — divide an Observable into a set of Observables that emit groups of
items from the original Observable, organized by key - buffer( ) — periodically gather items from an Observable into bundles and emit these bundles rather than
emitting the items one at a time - window( ) — periodically subdivide items from an Observable into Observable windows and emit these
windows rather than emitting the items one at a time
![Page 22: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/22.jpg)
![Page 23: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/23.jpg)
MapObservable.from(Arrays.asList("Esa", "Esa", "Esa")) .map(s -> s + " ganteng") .subscribe(System.out::println);
// print Esa ganteng 3 times
![Page 24: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/24.jpg)
![Page 25: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/25.jpg)
FlatMapObservable.just( Arrays.asList("Tiramisu", "Black Forest", "Black Mamba"))
.flatMap(Observable::from)
.map(String::length)
.subscribe(System.out::print);
// print 8,11,12
![Page 26: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/26.jpg)
Confused?
Getting map/flatMap/compose mixed up? Think types:map : T -> RflatMap : T -> Observable<R>compose : Observable<T> -> Observable<R>#ProTips
![Page 27: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/27.jpg)
Retrofit Integration@GET("mobile_detail_calc_halte_trans.php") Observable<List<HalteDetail>> getHalteDetails(@Query("coridor") String coridor);
mApiService.getHalteDetails(halte.getCoridor()) .observeOn(AndroidSchedulers.mainThread()) .doOnTerminate(this::resetUILoading) .subscribe(halteDetails -> { if (halteDetails != null) { setMarker(halteDetails); } });
![Page 28: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/28.jpg)
More ExamplesmApiService.getCommentList()
.compose(bindToLifecycle())
.compose(applyApiCall())
.doOnTerminate(this::stopLoading)
.subscribe(comments -> {
if (comments != null)
mCommentAdapter.pushData(comments);
});
![Page 29: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/29.jpg)
More SamplesObservable<Bitmap> imageObservable = Observable.create(observer -> { Bitmap bm = downloadBitmap(); return bm; }); imageObservable.subscribe(image -> loadToImageView(image));
// blocking the UI thread
imageObservable .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(image -> loadToImageView(image));
// non blocking but also execute loadToImageView on UI Thread
![Page 30: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/30.jpg)
More Examples public Observable<List<Area>> getAreas() { Observable<List<Area>> network = mApiService.getArea() .observeOn(AndroidSchedulers.mainThread()) .doOnNext(areas -> saveAreas(areas)); Observable<List<Area>> cache = getAreasFromLocal(); return Observable.concat(cache, network).first(areas -> areas != null); }
![Page 31: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/31.jpg)
More Examples (Again)public void onLocationChanged(Location location) {
onLocationChanged.onNext(location);
}
mGmsLocationManager.onLocationChanged
.throttleLast(10, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(location -> {
mPrensenter.updateMyLocation(location);
});
![Page 32: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/32.jpg)
FAQ1.Should we still use Thread and AsyncTask?2.Where to start?
![Page 33: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/33.jpg)
Third Party Implementation- Android ReactiveLocation
https://github.com/mcharmas/Android-ReactiveLocation
- RxPermissions https://github.com/tbruyelle/RxPermissions
- RxBinding https://github.com/JakeWharton/RxBinding
- SQLBritehttps://github.com/square/sqlbrite
- RxLifeCyclehttps://github.com/trello/RxLifecycle
![Page 34: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/34.jpg)
Links- http://slides.com/yaroslavheriatovych/frponandroid - https://github.com/Netflix/RxJava/- https://github.com/orfjackal/retrolambda- https://github.com/evant/gradle-retrolambda- http://cr.openjdk.java.net/~briangoetz/lambda/lambda-translation.ht
ml- https://github.com/Netflix/RxJava/wiki
![Page 35: Introduction to rx java for android](https://reader035.fdocuments.us/reader035/viewer/2022062302/587c17291a28abb5068b4805/html5/thumbnails/35.jpg)
Questions?