30
RxJava in Action Pratama Nur Wijaya Android Developer - Kulina

Rx java in action

Embed Size (px)

Citation preview

Page 1: Rx java in action

RxJava in ActionPratama Nur Wijaya

Android Developer - Kulina

Page 2: Rx java in action

RxJava is a Java VM implementation of ReactiveX (Reactive Extensions): a library for composing asynchronous and event-based programs by using observable sequences.

RxJava ?

Page 3: Rx java in action

Why RxJavaAvoid callbackhellEasy to compose and transform async process,

combining, filtering, etcError handlingIt’s awesome

Page 4: Rx java in action

Cons RxJava- Learning Curve

Page 5: Rx java in action

Implementation

dependencies {

compile 'io.reactivex:rxandroid:1.2.1'

compile 'io.reactivex:rxjava:1.1.6'

}

Page 6: Rx java in action

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); } }});

Page 7: Rx java in action

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); }};

Page 8: Rx java in action

Subscriber

myObservable.subscribe(mySubscriber);// result : Hello World

Page 9: Rx java in action

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); } });

Page 10: Rx java in action

More Simple ?

Use Retrolambda

Page 11: Rx java in action

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'

Page 12: Rx java in action

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"));

Page 13: Rx java in action

RxJava Operator

Page 14: Rx java in action

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

Page 15: Rx java in action

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

Page 16: Rx java in action

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

Page 17: Rx java in action

RxJava + Asynchronous

Page 18: Rx java in action

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"); });

Page 19: Rx java in action

RxJava + OkHttp

Page 20: Rx java in action

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); } } });}

Page 21: Rx java in action

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"); });

Page 22: Rx java in action

RxJava + Retrofit 2

Page 23: Rx java in action

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();

Page 24: Rx java in action

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"); });

Page 25: Rx java in action

Be careful of Memory leak

Page 26: Rx java in action

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();}

Page 27: Rx java in action

RxBinding Demohttps://github.com/pratamawijaya/RxJavaInAction

Page 29: Rx java in action

Q & A