Post on 14-Apr-2017
RxJava in ActionPratama Nur Wijaya
Android Developer - Kulina
RxJava is a Java VM implementation of ReactiveX (Reactive Extensions): a library for composing asynchronous and event-based programs by using observable sequences.
RxJava ?
Why RxJavaAvoid callbackhellEasy to compose and transform async process,
combining, filtering, etcError handlingIt’s awesome
Cons RxJava- Learning Curve
Implementation
dependencies {
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
}
ObservableObservable<String> myObservable = Observable.create(
new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String>
subscriber) { try { subscriber.onNext("Hello World"); subscriber.onCompleted(); } catch (Exception e) { subscriber.onError(e); } }});
SubscriberSubscriber<String> mySubscriber = new Subscriber<String>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted: Completed"); }
@Override public void onError(Throwable e) { Log.e(TAG, "onError: Error " + e.getLocalizedMessage()); }
@Override public void onNext(String s) { Log.d(TAG, "onNext: " + s); }};
Subscriber
myObservable.subscribe(mySubscriber);// result : Hello World
Observable (Simplified)Observable.just("Hello World") .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted: Completed"); }
@Override public void onError(Throwable e) { Log.e(TAG, "onError: "+e.getLocalizedMessage() ); }
@Override public void onNext(String s) { Log.d(TAG, "onNext: " + s); } });
More Simple ?
Use Retrolambda
Simplified With Lambdabuildscript { repositories { mavenCentral() }
dependencies { classpath 'me.tatarka:gradle-retrolambda:3.2.5' }}
// Required because retrolambda is on maven centralrepositories { mavenCentral()}
apply plugin: 'com.android.application' //or apply plugin: 'java'apply plugin: 'me.tatarka.retrolambda'
Observable (Simplified with Retrolambda)
Observable.just("Hello World") .subscribe( s -> Log.d(TAG, "onNext: " + s), throwable -> Log.e(TAG, "onError: " + throwable.getLocalizedMessage()), () -> Log.d(TAG, "onCompleted: Completed"));
RxJava Operator
Observable.just(1, 2, 3, 4, 5) .map(integer -> integer * 2) .subscribe(result -> { Log.d(TAG, "onCreate: result :"+result); }, throwable -> { Log.e(TAG, "onCreate: "+throwable.getLocalizedMessage()); }, () -> { Log.i(TAG, "onCreate: finished"); });
// result : 2,4,6,8,10
Observable.just(1, 2, 3, 4, 5) .filter(integer -> integer % 2 == 0) .map(integer -> integer * 2) .subscribe(result -> { Log.d(TAG, "onCreate: result :" + result); }, throwable -> { Log.e(TAG, "onCreate: " + throwable.getLocalizedMessage()); }, () -> { Log.i(TAG, "onCreate: finished"); });
// result : 4,8
RxJava + Asynchronous
AsyncObservable.just(doNetworkOrLongOperation()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(s -> { Log.d(TAG, "onCreate: " + s); }, throwable -> { Log.e(TAG, "onCreate: " + throwable.getLocalizedMessage()); }, () -> { Log.i(TAG, "onCreate: completed"); });
RxJava + OkHttp
private Observable<String> getSomeString(){ return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { try{ OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url("SOME URL").build(); Response response = client.newCall(request).execute(); if (response != null) { final String result = response.body().string(); subscriber.onNext(result); subscriber.onCompleted(); } }catch (Exception e){ subscriber.onError(e); } } });}
RxJava + OkHttpgetSomeString().subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(s -> { Log.d(TAG, "onCreate: " + s); }, throwable -> { Log.e(TAG, "onCreate: " + throwable.getLocalizedMessage()); }, () -> { Log.i(TAG, "onCreate: completed"); });
RxJava + Retrofit 2
RxJava + Retrofit 2.x// dependencies
compile "com.squareup.retrofit2:adapter-rxjava:$RETROFIT_VERSION"
// setup retrofitRetrofit retrofit = new Retrofit.Builder().baseUrl(BuildConfig.SERVER_URL) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(okHttpClient) .build();
Service@GET("get_post/") Observable<SinglePostResponse> getPost(@Query("id") int id);
// handle it on your presenterdataManager.getPost(id, isUpdate) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(post -> { if (post != null) { // do something } }, throwable -> { Log.e(TAG, "getArticleDetail: "+throwable.getLocalizedMessage() ); }, () -> { Log.i(TAG, "getArticleDetail: completed"); });
Be careful of Memory leak
private CompositeSubscription compositeSubscription = new CompositeSubscription();
compositeSubscription.add(getSomeString().subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(s -> { Log.d(TAG, "onCreate: " + s); }, throwable -> { Log.e(TAG, "onCreate: " + throwable.getLocalizedMessage()); }, () -> { Log.i(TAG, "onCreate: completed"); }));
@Override protected void onDestroy() { super.onDestroy(); compositeSubscription.unsubscribe();}
RxBinding Demohttps://github.com/pratamawijaya/RxJavaInAction
Referenceshttp://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/https://github.com/kaushikgopal/RxJava-Android-Sampleshttps://www.ykode.com/2015/02/20/android-frp-rxjava-retrolambda.htmlhttps://gist.github.com/staltz/868e7e9bc2a7b8c1f754
Q & A
Thankspratama@kulina.idtama@fanboy.id |
set.mnemonix@gmail.com
https://pratamawijaya.com