rx java in action

Post on 14-Apr-2017

202 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

Check http://rxmarbles.com/ for more operator

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

Q & A

Thankspratama@kulina.idtama@fanboy.id |

set.mnemonix@gmail.com

https://pratamawijaya.com

top related