SlideShare a Scribd company logo
1 of 112
Download to read offline
RxJava 2.0 介紹
黃千碩 (Kros)
oSolve, Ltd./打⼯工趣
Mobile App Developer
• 如果尚未了了解 RxJava,可以看
• RxJava 介紹與 Android 中的 RxJava

https://speakerdeck.com/ch8908/rxjava-jie-shao-yu-android-
zhong-de-rxjava
為什什麼要有 2.0
• RxJava 2.0 has been completely rewritten from scratch on top of
the Reactive-Streams specification. The specification itself has
evolved out of RxJava 1.x and provides a common baseline for
reactive systems and libraries.
• 因為要符合 Reactive-Streams specification。所以把 RxJava Library
重寫⼀一遍,稱作 2.0
什什麼是Reactive Streams
• Reactive Streams is an initiative to provide a standard for
asynchronous stream processing with non-blocking back
pressure. This encompasses efforts aimed at runtime
environments (JVM and JavaScript) as well as network protocols.
• 簡單來來說就是⼀一個 “處理理 asynchronous 程式” 的標準規範
反觀 Java 9
• Java 9 也⽀支援 Reactive-Streams specification
• Reactive Programming with JDK 9 Flow API

https://community.oracle.com/docs/DOC-1006738
interface Publisher<T> {

void subscribe(Subscriber<? super T> s);

}



interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void request(long n);

void cancel();

}
interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
Reactive-Streams specification
Reactive Programming
是趨勢
Reactive Programming
是趨勢
直接從 RxJava 2.0 開始學吧!
RxJava
• A set of classes for representing sources of data.
• A set of classes for listening to data sources.
• A set of methods for modifying and composing the data.
RxJava
• A set of classes for representing sources of data.
• A set of classes for listening to data sources.
• A set of methods for modifying and composing the data.
Sources
• 通常當你開始(或結束)監聽時,才開始運作。
• 運作時可以是 synchronous 或 asynchronous。
• Source 傳送的資料可以是 Single item, many items, 或
empty。
• 當發⽣生 error 或收到 complete 時結束。也或者永遠不結束。
2.0 差別
• 新增了了不同的 來來源(Source)
• RxJava 1.0 - Only Observable
• RxJava 2.0 - Observable And Flowable
interface Publisher<T> {

void subscribe(Subscriber<? super T> s);

}



interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void request(long n);

void cancel();

}
interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
Flowable vs. Observable
interface Publisher<T> {

public void subscribe(Subscriber<? super T> s);

}
Flowable
Flowable vs. Observable
Observable
interface ObservableSource<T> {

void subscribe(Observer<? super T> observer);

}
Flowable vs. Observable
• Observable<T>
• 發射 0 ~ n 筆資料
• 收到 complete 或 error 時結束
• 沒有流量量控制(backpressure)
• Flowable<T>
• 發射 0 ~ n 筆資料
• 收到 complete 或 error 時結束
• 有流量量控制(backpressure)
Flowable vs. Observable
• Observable<T>
• 發射 0 ~ n 筆資料
• 收到 complete 或 error 時結束
• 沒有流量量控制
• Flowable<T>
• 發射 0 ~ n 筆資料
• 收到 complete 或 error 時結束
• 有流量量控制
Reactive-Streams specification
interface Publisher<T> {

void subscribe(Subscriber<? super T> s);

}



interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void request(long n);

void cancel();

}
interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
流量量控制
(Backpressure)
Flowable vs. Observable
• Why Flowable and Observable?
• 為什什麼不統⼀一使⽤用⼀一種就好?
Flowable vs. Observable
• 本質上,不是每⼀一種 Source 都能夠流量量控制(Backpressure)。
Flowable vs. Observable
Observable<MotionEvent> events
= RxView.touches(paintView)

Flowable vs. Observable
Observable<MotionEvent> events
= RxView.touches(paintView)

無法控制 User 畫圖的事件,
本質上無法做流量量控制(Backpressure)
Flowable vs. Observable
Observable<MotionEvent> events
= RxView.touches(paintView)

Observable<Row> rows
= db.createQuery("SELECT *")

無法控制 User 畫圖的事件,
本質上無法做流量量控制(Backpressure)
Flowable vs. Observable
Observable<MotionEvent> events
= RxView.touches(paintView)

Observable<Row> rows
= db.createQuery("SELECT *")

while (cursor.moveToNext()) {
// …
}
Flowable vs. Observable
Observable<MotionEvent> events
= RxView.touches(paintView)

Observable<Row> rows
= db.createQuery("SELECT *")

while (cursor.moveToNext()) {
// …
}
Cursor 就是流量量控制
Flowable vs. Observable
Observable<MotionEvent> events
= RxView.touches(paintView)

Flowable<Row> rows
= db.createQuery("SELECT *")

while (cursor.moveToNext()) {
// …
}
• 要針對不同的情況,使⽤用不同的 Design Pattern。
interface Publisher<T> {

public void subscribe(Subscriber<? super T> s);

}
Flowable
Flowable vs. Observable
Observable
interface ObservableSource<T> {

void subscribe(Observer<? super T> observer);

}
interface Publisher<T> {

public void subscribe(Subscriber<? super T> s);

}
Flowable
Flowable vs. Observable
Observable
interface ObservableSource<T> {

void subscribe(Observer<? super T> observer);

}
interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void cancel();

void request(long r);

}
Observable Flowable
Flowable vs. Observable
interface Observer<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Disposable d);

}



interface Disposable {

void dispose();

}
interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void cancel();

void request(long r);

}
interface Observer<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Disposable d);

}



interface Disposable {

void dispose();

}
Observable Flowable
Flowable vs. Observable
• 收到 Source 傳來來的資料,可接收多次。
interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void cancel();

void request(long r);

}
interface Observer<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Disposable d);

}



interface Disposable {

void dispose();

}
Observable Flowable
Flowable vs. Observable
• 收到完成,表⽰示此 Source 已經「成功」的結束,不再傳送任何東⻄西。
interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void cancel();

void request(long r);

}
interface Observer<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Disposable d);

}



interface Disposable {

void dispose();

}
Observable Flowable
Flowable vs. Observable
• 此 Source 發⽣生錯誤,並結束。
Flowable vs. Observable
interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void cancel();

void request(long r);

}
interface Observer<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Disposable d);

}



interface Disposable {

void dispose();

}
Observable Flowable
Source Specializations
• RxJava 2.0 額外新增了了幾個特別的 Source
• 這些 Source 為 Observable 的⼦子集和(subsets)
Source Specializations
• RxJava 2.0 額外新增了了幾個特別的 Source
• 這些 Source 為 Observable 的⼦子集和(subsets)
• Single - 回傳 1 或 error
• Completable - 回傳 complete 或 error
• Maybe - 回傳 0, 1, complete 或 error
Single
• 只會回傳下列列兩兩種情況:
• Succeeds with an item.
• Errors
• 不⽀支援流量量控制(backpressure)
Completable
• 只會回傳下列列兩兩種情況:
• Completes (no items!)
• Errors
• 不⽀支援流量量控制(backpressure)
Maybe
• 只會回傳下列列三種情況:
• Succeeds with an item.
• Completes with no items.
• Errors
• 不⽀支援流量量控制(backpressure)
Source Specializations
• RxJava 2.0 額外新增了了幾個特別的 Source
• 這些 Source 為 Observable 的⼦子集和(subsets)
• Single - 回傳 1 或 error
• Completable - 回傳 complete 或 error
• Maybe - 回傳 0, 1, complete 或 error
Creating Sources
Flowable.just("Hello");

Flowable.just("Hello", "World");



Observable.just("Hello");

Observable.just("Hello", "World");



Single.just("Hello");



Maybe.just("Hello");
Creating Sources
String[] array = {"a", "b"};

List<String> list = new ArrayList<>();


Flowable.fromArray(array);

Flowable.fromIterable(list);



Observable.fromArray(array);

Observable.fromIterable(list);
Creating Sources
Flowable.fromCallable(() -> "Hello");



Observable.fromCallable(() -> "Hello");



Single.fromCallable(() -> "Hello");



Maybe.fromCallable(() -> "Hello");



Completable.fromCallable(() -> "Ignore!");

Creating Sources
Flowable.fromCallable(() -> "Hello");



Observable.fromCallable(() -> "Hello");



Single.fromCallable(() -> "Hello");



Maybe.fromCallable(() -> "Hello");

Maybe.fromAction(() -> System.out.println("Hello"));

Maybe.fromRunnable(() -> System.out.println("Hello"));



Completable.fromCallable(() -> "Ignore!");

Completable.fromAction(() -> System.out.println("Hello"));

Completable.fromRunnable(() -> System.out.println("Hello"));
Creating Sources
Observable.fromCallable(new Callable<String>() {

@Override

public String call() throws Exception {

return "Hello";

}

});
• Returns an Observable that, when an observer
subscribes to it, invokes a function you specify and
then emits the value returned from that function.
• 當有⼈人訂閱 (subscribe) 時,才發射資料。
Creating Sources
Observable.create();
Creating Sources
Observable.create(new ObservableOnSubscribe<String>() {

@Override

public void subscribe(ObservableEmitter<String> e) throws Exception {

e.onNext("Hello");

e.onComplete();

}

});
Creating Sources
Observable.create(new ObservableOnSubscribe<String>() {

@Override

public void subscribe(ObservableEmitter<String> e) throws Exception {

e.onNext("Hello");

e.onComplete();

}

});
Creating Sources
Observable.create(new ObservableOnSubscribe<String>() {

@Override

public void subscribe(ObservableEmitter<String> e) throws Exception {

e.onNext("Hello");

e.onComplete();

}

});
Creating Sources
Observable.create(new ObservableOnSubscribe<String>() {

@Override

public void subscribe(ObservableEmitter<String> e) throws Exception {

e.onNext("Hello");

e.onComplete();

}

});
Creating Sources
Observable.create(e -> {

e.onNext("Hello");

e.onComplete();

});
Creating Sources
Observable.create(e -> {

e.onNext(“Hello");
e.onNext("World");

e.onComplete();

});
• 可以呼叫多次 onNext
• (fromCallable 只能呼叫⼀一次 onNext)
Creating Sources
ExecutorService executor = Executors.newSingleThreadExecutor();

Observable.create(e -> {

executor.submit(() -> {

// ...

e.onNext(result);

e.onComplete();

});

});
• 可在 background thread 呼叫 onNext,實作 async task。
Creating Sources
OkHttpClient client = // …
Request request = // …


Observable.create(e -> {

client.newCall(request).enqueue(new Callback() {

@Override

public void onResponse(Call call, Response response) throws IOException {

e.onNext(response.body().toString());

e.onComplete();

}



@Override

public void onFailure(Call call, IOException ex) {

e.onError(ex);

}

});

});
Creating Sources
OkHttpClient client = // …
Request request = // …


Observable.create(e -> {

client.newCall(request).enqueue(new Callback() {

@Override

public void onResponse(Call call, Response response) throws IOException {

e.onNext(response.body().toString());

e.onComplete();

}



@Override

public void onFailure(Call call, IOException ex) {

e.onError(ex);

}

});

});
Creating Sources
OkHttpClient client = // …
Request request = // …


Observable.create(e -> {

client.newCall(request).enqueue(new Callback() {

@Override

public void onResponse(Call call, Response response) throws IOException {

e.onNext(response.body().toString());

e.onComplete();

}



@Override

public void onFailure(Call call, IOException ex) {

e.onError(ex);

}

});

});
Creating Sources
OkHttpClient client = // …
Request request = // …


Observable.create(e -> {

client.newCall(request).enqueue(new Callback() {

@Override

public void onResponse(Call call, Response response) throws IOException {

e.onNext(response.body().toString());

e.onComplete();

}



@Override

public void onFailure(Call call, IOException ex) {

e.onError(ex);

}

});

});
Creating Sources
OkHttpClient client = // …
Request request = // …


Observable.create(e -> {

Call call = client.newCall(request);

e.setCancellable(() -> call.cancel());

call.enqueue(new Callback() {

@Override

public void onResponse(Call call, Response response) throws IOException {

e.onNext(response.body().toString());

e.onComplete();

}



@Override

public void onFailure(Call call, IOException ex) {

e.onError(ex);

}

});

});
Creating Sources
OkHttpClient client = // …
Request request = // …


Observable.create(e -> {

Call call = client.newCall(request);

e.setCancellable(() -> call.cancel());

call.enqueue(new Callback() {

@Override

public void onResponse(Call call, Response response) throws IOException {

e.onNext(response.body().toString());

e.onComplete();

}



@Override

public void onFailure(Call call, IOException ex) {

e.onError(ex);

}

});

});
當 unsubscribe 時,取消 request
Creating Sources
Button button = // …
Observable.create(e -> {

e.setCancellable(() -> {

button.setOnClickListener(null)
});
button.setOnClickListener(v -> e.onNext(v));

});
Creating Sources
Button button = // …
Observable.create(e -> {

e.setCancellable(() -> {

button.setOnClickListener(null)
});
button.setOnClickListener(v -> e.onNext(v));

});
• 在 Android 中常會⽤用到,避免 memory leak。
Observing Sources
Observing Sources
interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void cancel();

void request(long r);

}
interface Observer<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Disposable d);

}



interface Disposable {

void dispose();

}
Observable Flowable
Observing Sources
interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void cancel();

void request(long r);

}
interface Observer<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Disposable d);

}



interface Disposable {

void dispose();

}
Observable Flowable
• 當開始監聽資料時,會⾺馬上呼叫 onSubscribe。
Observing Sources
interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void cancel();

void request(long r);

}
interface Observer<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Disposable d);

}



interface Disposable {

void dispose();

}
Observable Flowable
interface Subscriber<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Subscription s);

}



interface Subscription {

void cancel();

void request(long r);

}
interface Observer<T> {

void onNext(T t);

void onComplete();

void onError(Throwable t);

void onSubscribe(Disposable d);

}



interface Disposable {

void dispose();

}
Observable Flowable
• 當開始監聽資料時,會⾺馬上呼叫 onSubscribe。
• Observer 可以利利⽤用 onSubscribe 提供的物件,呼叫 cancel 或是 backpressure。
Observing Sources
Observing Sources
Observable.just("Hello").subscribe(new Observer<String>() {

@Override

public void onNext(String value) {



}

@Override

public void onComplete() {



}

@Override

public void onError(Throwable e) {



}

@Override

public void onSubscribe(Disposable d) {



}

});
Observing Sources
Observable.just("Hello").subscribe(new Observer<String>() {

@Override

public void onNext(String value) {



}

@Override

public void onComplete() {



}

@Override

public void onError(Throwable e) {



}

@Override

public void onSubscribe(Disposable d) {



}

});
Observing Sources
Observable.just("Hello").subscribe(new DisposableObserver<String>() {

@Override

public void onNext(String value) {

}


@Override

public void onComplete() {

}



@Override

public void onError(Throwable e) {

}

});
Observing Sources
DisposableObserver<String> observer = new DisposableObserver<String>() {

@Override

public void onNext(String value) {

}



@Override

public void onComplete() {

}



@Override

public void onError(Throwable e) {

}

};


Observable.just(“Hello”).subscribe(observer);
Observing Sources
DisposableObserver<String> observer = new DisposableObserver<String>() {

@Override

public void onNext(String value) {

}



@Override

public void onComplete() {

}



@Override

public void onError(Throwable e) {

}

};


Observable.just(“Hello”).subscribe(observer);
// 如何 unsubscribe ?
Observing Sources
DisposableObserver<String> observer = new DisposableObserver<String>() {

@Override

public void onNext(String value) {

}



@Override

public void onComplete() {

}



@Override

public void onError(Throwable e) {

}

};


Observable.just(“Hello").subscribe(observer);
observer.dispose();
Observing Sources
Observable<String> o = Observable.just("Hello");
Disposable d = o.subscribeWith(new DisposableObserver<String>() {

@Override

public void onNext(String value) { … }

@Override

public void onComplete() { … }

@Override

public void onError(Throwable e) { … }

});
d.dispose();
Observing Sources
Observable<String> o = Observable.just(“Hello");
Disposable d = o.subscribeWith(new DisposableObserver<String>() {

@Override

public void onNext(String value) { … }

@Override

public void onComplete() { … }

@Override

public void onError(Throwable e) { … }

});
d.dispose();
New Method: subscribeWith
Observing Sources
Observable<String> o = Observable.just(“Hello");
Disposable d = o.subscribeWith(new DisposableObserver<String>() {

@Override

public void onNext(String value) { … }

@Override

public void onComplete() { … }

@Override

public void onError(Throwable e) { … }

});
d.dispose();
回傳 Disposable
Observing Sources
Observable<String> o = Observable.just(“Hello");
Disposable d = o.subscribeWith(new DisposableObserver<String>() {

@Override

public void onNext(String value) { … }

@Override

public void onComplete() { … }

@Override

public void onError(Throwable e) { … }

});
d.dispose();
Observing Sources
Observable<String> o = Observable.just(“Hello”);
CompositeDisposable disposables = new CompositeDisposable();
disposables.add(o.subscribeWith(new DisposableObserver<String>() {

@Override

public void onNext(String value) { … }

@Override

public void onComplete() { … }

@Override

public void onError(Throwable e) { … }

}));
disposables.dispose();
Observing Sources
Observable<String> o = Observable.just(“Hello”);
CompositeDisposable disposables = new CompositeDisposable();
disposables.add(o.subscribeWith(new DisposableObserver<String>() {

@Override

public void onNext(String value) { … }

@Override

public void onComplete() { … }

@Override

public void onError(Throwable e) { … }

}));
disposables.dispose();
Observing Sources
Observable<String> o = Observable.just(“Hello”);
CompositeDisposable disposables = new CompositeDisposable();
disposables.add(o.subscribeWith(new DisposableObserver<String>() {

@Override

public void onNext(String value) { … }

@Override

public void onComplete() { … }

@Override

public void onError(Throwable e) { … }

}));
disposables.dispose();
Observing Sources
Observable<String> o = Observable.just("Hello");

o.subscribeWith(new DisposableObserver<String>() { … });
Maybe<String> m = Maybe.just("Hello");

m.subscribeWith(new DisposableObserver<String>() { … });
Single<String> s = Single.just("Hello");

s.subscribeWith(new DisposableObserver<String>() { … });
Completable<String> c = Completable.completed(“Hello");

c.subscribeWith(new DisposableObserver<String>() { … });
Observing Sources
Flowable<String> f = Flowable.just("Hello");

f.subscribeWith(new DisposableSubscriber<String>() { … });
Observable<String> o = Observable.just("Hello");

o.subscribeWith(new DisposableObserver<String>() { … });
Maybe<String> m = Maybe.just("Hello");

m.subscribeWith(new DisposableObserver<String>() { … });
Single<String> s = Single.just("Hello");

s.subscribeWith(new DisposableObserver<String>() { … });
Completable<String> c = Completable.completed(“Hello");

c.subscribeWith(new DisposableObserver<String>() { … });
• Flowable 也提供類似的 Disposable。
RxJava
• A set of classes for representing sources of data.
• A set of classes for listening to data sources.
• A set of methods for modifying and composing the data.
Operators
String normal = "hello";

String upperCase = normal.toUpperCase();
Operators
String normal = "hello";

String upperCase = normal.toUpperCase();
Observable<String> normal = Observable.just("hello");

Observable<String> upperCase = normal.map(s -> s.toUpperCase());
Operators
Observable.fromCallable(new Callable<String>() {

@Override

public String call() throws Exception {

// ...

return result;

}

});
Operators
Observable.fromCallable(new Callable<String>() {

@Override

public String call() throws Exception {

// ...

return result;

}

}).subscribeOn(Schedulers.computation());
Operators
Observable.fromCallable(new Callable<String>() {

@Override

public String call() throws Exception {

// ...

return result;

}

}).subscribeOn(Schedulers.computation());
• 在 background thread 做事情。
bg thread
Operators
Observable.fromCallable(new Callable<String>() {

@Override

public String call() throws Exception {

// ...

return result;

}

}).subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
bg thread
Operators
Observable.fromCallable(new Callable<String>() {

@Override

public String call() throws Exception {

// ...

return result;

}

}).subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
• Observer 在 main thread 做事情。
bg thread
main thread
Operators
Observable.fromCallable(new Callable<String>() {

@Override

public String call() throws Exception {

// ...

return result;

}

}).subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
• Observer 在 main thread 做事情。
main thread
bg thread
Operators
Observable.fromCallable(() -> {

return result;

}).subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.map()
.subscribe(observer);
Operators
Observable.fromCallable(() -> {

return result;

}).subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.map()
.subscribe(observer);
main thread
Operators
Observable.fromCallable(() -> {

return result;

}).subscribeOn(Schedulers.computation())
.map()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
Operators
Observable.fromCallable(() -> {

return result;

}).subscribeOn(Schedulers.computation())
.map()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
• Order 有關係
computation thread
Operators
Observable.fromCallable(() -> {

return result;

}).subscribeOn(Schedulers.computation())
.map()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
Operators
Observable.fromCallable(() -> {

return result;

}).subscribeOn(Schedulers.computation())
.map()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
computation thread
Operators
Observable.fromCallable(() -> {

return result;

}).subscribeOn(Schedulers.computation())
.map()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
?? thread
computation thread
Operators
Observable.fromCallable(() -> {

return result;

}).subscribeOn(Schedulers.computation())
.map()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
computation thread
computation thread
Operators
Observable.fromCallable(() -> {

return result;

}).subscribeOn(Schedulers.computation())
.map()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
• 在同⼀一個 Source 中,subscribeOn 是先搶先贏。會依照第⼀一次
subscribeOn 的 schedulers 為準。
computation thread
computation thread
• RxJava 1.0 Operator:
• first() - return Observable
• takeFirst() - return Observable
Operators
• RxJava 1.0 Operator:
• first() - return Observable
• takeFirst() - return Observable
• first():找出第⼀一個 element,如果沒有任何 item 則會回傳
error。
• takeFirst():找出第⼀一個 element,就算沒有拿到任何 item,也會
回傳 succeed。
Operators
• RxJava 2.0 Operator:
• firstOrError() - return Single
• firstElement() - return Maybe
Operators
• RxJava 2.0 Operator:
• firstOrError() - return Single
• firstElement() - return Maybe
• BJ4
Operators
Being Reactive
apiService.listToilets()

Being Reactive
apiService.listToilets()
.subscribeOn(Schedulers.io())

Being Reactive
apiService.listToilets()
.subscribeOn(Schedulers.io())

.toSortedList(this::compareDistance)
Being Reactive
apiService.listToilets()
.subscribeOn(Schedulers.io())

.toSortedList(this::compareDistance)
.observerOn(AndroidSchedulers.mainThread())
Being Reactive
apiService.listToilets()
.subscribeOn(Schedulers.io())

.toSortedList(this::compareDistance)
.observerOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<String>() {

@Override

public void onNext(String value) {

// Show toilets.

}

@Override

public void onComplete() {/* ignore */}

@Override

public void onError(Throwable e) {/* show error */}

});
Being Reactive
disposables.add(apiService.listToilets()
.subscribeOn(Schedulers.io())

.toSortedList(this::compareDistance)
.observerOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<String>() {

@Override

public void onNext(String value) {

// Show toilets.

}

@Override

public void onComplete() {/* ignore */}

@Override

public void onError(Throwable e) {/* show error */}

}));
Being Reactive
// onCreate
disposables.add(apiService.listToilets()
.subscribeOn(Schedulers.io())

.toSortedList(this::compareDistance)
.observerOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<String>() {

@Override

public void onNext(String value) {

// Show toilets.

}

@Override

public void onComplete() {/* ignore */}

@Override

public void onError(Throwable e) {/* show error */}

}));
// onDestory
disposables.dispose();
Architecture 2.x
• 建立資料流(stream)時使⽤用更更少的資源。
• 監聽資料流時(stream)時負擔更更少。
• 更更有效率的 RxJava
RxJava 2
• 撰寫程式的⽬目的是:能夠針對 Android 上的資料或UI變動時,做出應
有反應。
• ⽽而不是去主導或管理理這些變動。
Reference
• Exploring RxJava 2 for Android

https://speakerdeck.com/jakewharton/exploring-rxjava-2-for-
android-gotocph-october-2016
• RxJava Official wiki

https://github.com/ReactiveX/RxJava/wiki/What's-different-
in-2.0
• Reactive-streams API

http://www.reactive-streams.org/reactive-streams-1.0.0-
javadoc/
Reference
• Reactive-Streams

http://www.reactive-streams.org/

More Related Content

What's hot

What's hot (20)

Reactive Java (33rd Degree)
Reactive Java (33rd Degree)Reactive Java (33rd Degree)
Reactive Java (33rd Degree)
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
 
Reactive Java (GeeCON 2014)
Reactive Java (GeeCON 2014)Reactive Java (GeeCON 2014)
Reactive Java (GeeCON 2014)
 
Introduction to Reactive Java
Introduction to Reactive JavaIntroduction to Reactive Java
Introduction to Reactive Java
 
RxJava Applied
RxJava AppliedRxJava Applied
RxJava Applied
 
Reactive Android: RxJava and beyond
Reactive Android: RxJava and beyondReactive Android: RxJava and beyond
Reactive Android: RxJava and beyond
 
Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for Android
 
How to Think in RxJava Before Reacting
How to Think in RxJava Before ReactingHow to Think in RxJava Before Reacting
How to Think in RxJava Before Reacting
 
Introduction to Retrofit and RxJava
Introduction to Retrofit and RxJavaIntroduction to Retrofit and RxJava
Introduction to Retrofit and RxJava
 
Intro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich AndroidIntro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich Android
 
Rx java in action
Rx java in actionRx java in action
Rx java in action
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
 
RxJava in practice
RxJava in practice RxJava in practice
RxJava in practice
 
RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015
 
Streams, Streams Everywhere! An Introduction to Rx
Streams, Streams Everywhere! An Introduction to RxStreams, Streams Everywhere! An Introduction to Rx
Streams, Streams Everywhere! An Introduction to Rx
 
RxJava applied [JavaDay Kyiv 2016]
RxJava applied [JavaDay Kyiv 2016]RxJava applied [JavaDay Kyiv 2016]
RxJava applied [JavaDay Kyiv 2016]
 
GKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroidGKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroid
 
rx-java-presentation
rx-java-presentationrx-java-presentation
rx-java-presentation
 
Reactive programming with RxAndroid
Reactive programming with RxAndroidReactive programming with RxAndroid
Reactive programming with RxAndroid
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJava
 

Similar to RxJava 2.0 介紹

Similar to RxJava 2.0 介紹 (20)

Reactive mesh
Reactive meshReactive mesh
Reactive mesh
 
Reactive Streams and RxJava2
Reactive Streams and RxJava2Reactive Streams and RxJava2
Reactive Streams and RxJava2
 
RxJS In-Depth - AngularConnect 2015
RxJS In-Depth - AngularConnect 2015RxJS In-Depth - AngularConnect 2015
RxJS In-Depth - AngularConnect 2015
 
Journey into Reactive Streams and Akka Streams
Journey into Reactive Streams and Akka StreamsJourney into Reactive Streams and Akka Streams
Journey into Reactive Streams and Akka Streams
 
RxJava - introduction & design
RxJava - introduction & designRxJava - introduction & design
RxJava - introduction & design
 
Welcome to rx java2
Welcome to rx java2Welcome to rx java2
Welcome to rx java2
 
Reactive Programming in Java and Spring Framework 5
Reactive Programming in Java and Spring Framework 5Reactive Programming in Java and Spring Framework 5
Reactive Programming in Java and Spring Framework 5
 
Reactive Spring 5
Reactive Spring 5Reactive Spring 5
Reactive Spring 5
 
Intro to Rx Java
Intro to Rx JavaIntro to Rx Java
Intro to Rx Java
 
Reactive java - Reactive Programming + RxJava
Reactive java - Reactive Programming + RxJavaReactive java - Reactive Programming + RxJava
Reactive java - Reactive Programming + RxJava
 
Reactive Card Magic: Understanding Spring WebFlux and Project Reactor
Reactive Card Magic: Understanding Spring WebFlux and Project ReactorReactive Card Magic: Understanding Spring WebFlux and Project Reactor
Reactive Card Magic: Understanding Spring WebFlux and Project Reactor
 
Iniciación rx java
Iniciación rx javaIniciación rx java
Iniciación rx java
 
Threading Made Easy! A Busy Developer’s Guide to Kotlin Coroutines
Threading Made Easy! A Busy Developer’s Guide to Kotlin CoroutinesThreading Made Easy! A Busy Developer’s Guide to Kotlin Coroutines
Threading Made Easy! A Busy Developer’s Guide to Kotlin Coroutines
 
Introduction of failsafe
Introduction of failsafeIntroduction of failsafe
Introduction of failsafe
 
Reactive database access with Slick3
Reactive database access with Slick3Reactive database access with Slick3
Reactive database access with Slick3
 
Streamlining with rx
Streamlining with rxStreamlining with rx
Streamlining with rx
 
RxJava2 Slides
RxJava2 SlidesRxJava2 Slides
RxJava2 Slides
 
Reactive Programming In Java Using: Project Reactor
Reactive Programming In Java Using: Project ReactorReactive Programming In Java Using: Project Reactor
Reactive Programming In Java Using: Project Reactor
 
Reactive Streams - László van den Hoek
Reactive Streams - László van den HoekReactive Streams - László van den Hoek
Reactive Streams - László van den Hoek
 
Javantura v3 - Going Reactive with RxJava – Hrvoje Crnjak
Javantura v3 - Going Reactive with RxJava – Hrvoje CrnjakJavantura v3 - Going Reactive with RxJava – Hrvoje Crnjak
Javantura v3 - Going Reactive with RxJava – Hrvoje Crnjak
 

Recently uploaded

VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Kandungan 087776558899
 
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
dollysharma2066
 

Recently uploaded (20)

Hostel management system project report..pdf
Hostel management system project report..pdfHostel management system project report..pdf
Hostel management system project report..pdf
 
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
 
Work-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptxWork-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptx
 
DC MACHINE-Motoring and generation, Armature circuit equation
DC MACHINE-Motoring and generation, Armature circuit equationDC MACHINE-Motoring and generation, Armature circuit equation
DC MACHINE-Motoring and generation, Armature circuit equation
 
UNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its PerformanceUNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its Performance
 
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
 
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance BookingCall Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
 
Employee leave management system project.
Employee leave management system project.Employee leave management system project.
Employee leave management system project.
 
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
 
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
 
data_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdfdata_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdf
 
Unit 2- Effective stress & Permeability.pdf
Unit 2- Effective stress & Permeability.pdfUnit 2- Effective stress & Permeability.pdf
Unit 2- Effective stress & Permeability.pdf
 
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPT
 
A Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna MunicipalityA Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna Municipality
 
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
 
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
 

RxJava 2.0 介紹

  • 1. RxJava 2.0 介紹 黃千碩 (Kros) oSolve, Ltd./打⼯工趣 Mobile App Developer
  • 2. • 如果尚未了了解 RxJava,可以看 • RxJava 介紹與 Android 中的 RxJava
 https://speakerdeck.com/ch8908/rxjava-jie-shao-yu-android- zhong-de-rxjava
  • 3. 為什什麼要有 2.0 • RxJava 2.0 has been completely rewritten from scratch on top of the Reactive-Streams specification. The specification itself has evolved out of RxJava 1.x and provides a common baseline for reactive systems and libraries. • 因為要符合 Reactive-Streams specification。所以把 RxJava Library 重寫⼀一遍,稱作 2.0
  • 4. 什什麼是Reactive Streams • Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure. This encompasses efforts aimed at runtime environments (JVM and JavaScript) as well as network protocols. • 簡單來來說就是⼀一個 “處理理 asynchronous 程式” 的標準規範
  • 5. 反觀 Java 9 • Java 9 也⽀支援 Reactive-Streams specification • Reactive Programming with JDK 9 Flow API
 https://community.oracle.com/docs/DOC-1006738
  • 6. interface Publisher<T> {
 void subscribe(Subscriber<? super T> s);
 }
 
 interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void request(long n);
 void cancel();
 } interface Processor<T, R> extends Subscriber<T>, Publisher<R> { } Reactive-Streams specification
  • 9. RxJava • A set of classes for representing sources of data. • A set of classes for listening to data sources. • A set of methods for modifying and composing the data.
  • 10. RxJava • A set of classes for representing sources of data. • A set of classes for listening to data sources. • A set of methods for modifying and composing the data.
  • 11. Sources • 通常當你開始(或結束)監聽時,才開始運作。 • 運作時可以是 synchronous 或 asynchronous。 • Source 傳送的資料可以是 Single item, many items, 或 empty。 • 當發⽣生 error 或收到 complete 時結束。也或者永遠不結束。
  • 12. 2.0 差別 • 新增了了不同的 來來源(Source) • RxJava 1.0 - Only Observable • RxJava 2.0 - Observable And Flowable
  • 13. interface Publisher<T> {
 void subscribe(Subscriber<? super T> s);
 }
 
 interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void request(long n);
 void cancel();
 } interface Processor<T, R> extends Subscriber<T>, Publisher<R> { } Flowable vs. Observable
  • 14. interface Publisher<T> {
 public void subscribe(Subscriber<? super T> s);
 } Flowable Flowable vs. Observable Observable interface ObservableSource<T> {
 void subscribe(Observer<? super T> observer);
 }
  • 15. Flowable vs. Observable • Observable<T> • 發射 0 ~ n 筆資料 • 收到 complete 或 error 時結束 • 沒有流量量控制(backpressure) • Flowable<T> • 發射 0 ~ n 筆資料 • 收到 complete 或 error 時結束 • 有流量量控制(backpressure)
  • 16. Flowable vs. Observable • Observable<T> • 發射 0 ~ n 筆資料 • 收到 complete 或 error 時結束 • 沒有流量量控制 • Flowable<T> • 發射 0 ~ n 筆資料 • 收到 complete 或 error 時結束 • 有流量量控制
  • 17. Reactive-Streams specification interface Publisher<T> {
 void subscribe(Subscriber<? super T> s);
 }
 
 interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void request(long n);
 void cancel();
 } interface Processor<T, R> extends Subscriber<T>, Publisher<R> { } 流量量控制 (Backpressure)
  • 18. Flowable vs. Observable • Why Flowable and Observable? • 為什什麼不統⼀一使⽤用⼀一種就好?
  • 19. Flowable vs. Observable • 本質上,不是每⼀一種 Source 都能夠流量量控制(Backpressure)。
  • 20. Flowable vs. Observable Observable<MotionEvent> events = RxView.touches(paintView)

  • 21. Flowable vs. Observable Observable<MotionEvent> events = RxView.touches(paintView)
 無法控制 User 畫圖的事件, 本質上無法做流量量控制(Backpressure)
  • 22. Flowable vs. Observable Observable<MotionEvent> events = RxView.touches(paintView)
 Observable<Row> rows = db.createQuery("SELECT *")
 無法控制 User 畫圖的事件, 本質上無法做流量量控制(Backpressure)
  • 23. Flowable vs. Observable Observable<MotionEvent> events = RxView.touches(paintView)
 Observable<Row> rows = db.createQuery("SELECT *")
 while (cursor.moveToNext()) { // … }
  • 24. Flowable vs. Observable Observable<MotionEvent> events = RxView.touches(paintView)
 Observable<Row> rows = db.createQuery("SELECT *")
 while (cursor.moveToNext()) { // … } Cursor 就是流量量控制
  • 25. Flowable vs. Observable Observable<MotionEvent> events = RxView.touches(paintView)
 Flowable<Row> rows = db.createQuery("SELECT *")
 while (cursor.moveToNext()) { // … } • 要針對不同的情況,使⽤用不同的 Design Pattern。
  • 26. interface Publisher<T> {
 public void subscribe(Subscriber<? super T> s);
 } Flowable Flowable vs. Observable Observable interface ObservableSource<T> {
 void subscribe(Observer<? super T> observer);
 }
  • 27. interface Publisher<T> {
 public void subscribe(Subscriber<? super T> s);
 } Flowable Flowable vs. Observable Observable interface ObservableSource<T> {
 void subscribe(Observer<? super T> observer);
 }
  • 28. interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void cancel();
 void request(long r);
 } Observable Flowable Flowable vs. Observable interface Observer<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Disposable d);
 }
 
 interface Disposable {
 void dispose();
 }
  • 29. interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void cancel();
 void request(long r);
 } interface Observer<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Disposable d);
 }
 
 interface Disposable {
 void dispose();
 } Observable Flowable Flowable vs. Observable • 收到 Source 傳來來的資料,可接收多次。
  • 30. interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void cancel();
 void request(long r);
 } interface Observer<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Disposable d);
 }
 
 interface Disposable {
 void dispose();
 } Observable Flowable Flowable vs. Observable • 收到完成,表⽰示此 Source 已經「成功」的結束,不再傳送任何東⻄西。
  • 31. interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void cancel();
 void request(long r);
 } interface Observer<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Disposable d);
 }
 
 interface Disposable {
 void dispose();
 } Observable Flowable Flowable vs. Observable • 此 Source 發⽣生錯誤,並結束。
  • 32. Flowable vs. Observable interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void cancel();
 void request(long r);
 } interface Observer<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Disposable d);
 }
 
 interface Disposable {
 void dispose();
 } Observable Flowable
  • 33. Source Specializations • RxJava 2.0 額外新增了了幾個特別的 Source • 這些 Source 為 Observable 的⼦子集和(subsets)
  • 34. Source Specializations • RxJava 2.0 額外新增了了幾個特別的 Source • 這些 Source 為 Observable 的⼦子集和(subsets) • Single - 回傳 1 或 error • Completable - 回傳 complete 或 error • Maybe - 回傳 0, 1, complete 或 error
  • 35. Single • 只會回傳下列列兩兩種情況: • Succeeds with an item. • Errors • 不⽀支援流量量控制(backpressure)
  • 36. Completable • 只會回傳下列列兩兩種情況: • Completes (no items!) • Errors • 不⽀支援流量量控制(backpressure)
  • 37. Maybe • 只會回傳下列列三種情況: • Succeeds with an item. • Completes with no items. • Errors • 不⽀支援流量量控制(backpressure)
  • 38. Source Specializations • RxJava 2.0 額外新增了了幾個特別的 Source • 這些 Source 為 Observable 的⼦子集和(subsets) • Single - 回傳 1 或 error • Completable - 回傳 complete 或 error • Maybe - 回傳 0, 1, complete 或 error
  • 40. Creating Sources String[] array = {"a", "b"};
 List<String> list = new ArrayList<>(); 
 Flowable.fromArray(array);
 Flowable.fromIterable(list);
 
 Observable.fromArray(array);
 Observable.fromIterable(list);
  • 41. Creating Sources Flowable.fromCallable(() -> "Hello");
 
 Observable.fromCallable(() -> "Hello");
 
 Single.fromCallable(() -> "Hello");
 
 Maybe.fromCallable(() -> "Hello");
 
 Completable.fromCallable(() -> "Ignore!");

  • 42. Creating Sources Flowable.fromCallable(() -> "Hello");
 
 Observable.fromCallable(() -> "Hello");
 
 Single.fromCallable(() -> "Hello");
 
 Maybe.fromCallable(() -> "Hello");
 Maybe.fromAction(() -> System.out.println("Hello"));
 Maybe.fromRunnable(() -> System.out.println("Hello"));
 
 Completable.fromCallable(() -> "Ignore!");
 Completable.fromAction(() -> System.out.println("Hello"));
 Completable.fromRunnable(() -> System.out.println("Hello"));
  • 43. Creating Sources Observable.fromCallable(new Callable<String>() {
 @Override
 public String call() throws Exception {
 return "Hello";
 }
 }); • Returns an Observable that, when an observer subscribes to it, invokes a function you specify and then emits the value returned from that function. • 當有⼈人訂閱 (subscribe) 時,才發射資料。
  • 45. Creating Sources Observable.create(new ObservableOnSubscribe<String>() {
 @Override
 public void subscribe(ObservableEmitter<String> e) throws Exception {
 e.onNext("Hello");
 e.onComplete();
 }
 });
  • 46. Creating Sources Observable.create(new ObservableOnSubscribe<String>() {
 @Override
 public void subscribe(ObservableEmitter<String> e) throws Exception {
 e.onNext("Hello");
 e.onComplete();
 }
 });
  • 47. Creating Sources Observable.create(new ObservableOnSubscribe<String>() {
 @Override
 public void subscribe(ObservableEmitter<String> e) throws Exception {
 e.onNext("Hello");
 e.onComplete();
 }
 });
  • 48. Creating Sources Observable.create(new ObservableOnSubscribe<String>() {
 @Override
 public void subscribe(ObservableEmitter<String> e) throws Exception {
 e.onNext("Hello");
 e.onComplete();
 }
 });
  • 49. Creating Sources Observable.create(e -> {
 e.onNext("Hello");
 e.onComplete();
 });
  • 50. Creating Sources Observable.create(e -> {
 e.onNext(“Hello"); e.onNext("World");
 e.onComplete();
 }); • 可以呼叫多次 onNext • (fromCallable 只能呼叫⼀一次 onNext)
  • 51. Creating Sources ExecutorService executor = Executors.newSingleThreadExecutor();
 Observable.create(e -> {
 executor.submit(() -> {
 // ...
 e.onNext(result);
 e.onComplete();
 });
 }); • 可在 background thread 呼叫 onNext,實作 async task。
  • 52. Creating Sources OkHttpClient client = // … Request request = // … 
 Observable.create(e -> {
 client.newCall(request).enqueue(new Callback() {
 @Override
 public void onResponse(Call call, Response response) throws IOException {
 e.onNext(response.body().toString());
 e.onComplete();
 }
 
 @Override
 public void onFailure(Call call, IOException ex) {
 e.onError(ex);
 }
 });
 });
  • 53. Creating Sources OkHttpClient client = // … Request request = // … 
 Observable.create(e -> {
 client.newCall(request).enqueue(new Callback() {
 @Override
 public void onResponse(Call call, Response response) throws IOException {
 e.onNext(response.body().toString());
 e.onComplete();
 }
 
 @Override
 public void onFailure(Call call, IOException ex) {
 e.onError(ex);
 }
 });
 });
  • 54. Creating Sources OkHttpClient client = // … Request request = // … 
 Observable.create(e -> {
 client.newCall(request).enqueue(new Callback() {
 @Override
 public void onResponse(Call call, Response response) throws IOException {
 e.onNext(response.body().toString());
 e.onComplete();
 }
 
 @Override
 public void onFailure(Call call, IOException ex) {
 e.onError(ex);
 }
 });
 });
  • 55. Creating Sources OkHttpClient client = // … Request request = // … 
 Observable.create(e -> {
 client.newCall(request).enqueue(new Callback() {
 @Override
 public void onResponse(Call call, Response response) throws IOException {
 e.onNext(response.body().toString());
 e.onComplete();
 }
 
 @Override
 public void onFailure(Call call, IOException ex) {
 e.onError(ex);
 }
 });
 });
  • 56. Creating Sources OkHttpClient client = // … Request request = // … 
 Observable.create(e -> {
 Call call = client.newCall(request);
 e.setCancellable(() -> call.cancel());
 call.enqueue(new Callback() {
 @Override
 public void onResponse(Call call, Response response) throws IOException {
 e.onNext(response.body().toString());
 e.onComplete();
 }
 
 @Override
 public void onFailure(Call call, IOException ex) {
 e.onError(ex);
 }
 });
 });
  • 57. Creating Sources OkHttpClient client = // … Request request = // … 
 Observable.create(e -> {
 Call call = client.newCall(request);
 e.setCancellable(() -> call.cancel());
 call.enqueue(new Callback() {
 @Override
 public void onResponse(Call call, Response response) throws IOException {
 e.onNext(response.body().toString());
 e.onComplete();
 }
 
 @Override
 public void onFailure(Call call, IOException ex) {
 e.onError(ex);
 }
 });
 }); 當 unsubscribe 時,取消 request
  • 58. Creating Sources Button button = // … Observable.create(e -> {
 e.setCancellable(() -> {
 button.setOnClickListener(null) }); button.setOnClickListener(v -> e.onNext(v));
 });
  • 59. Creating Sources Button button = // … Observable.create(e -> {
 e.setCancellable(() -> {
 button.setOnClickListener(null) }); button.setOnClickListener(v -> e.onNext(v));
 }); • 在 Android 中常會⽤用到,避免 memory leak。
  • 61. Observing Sources interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void cancel();
 void request(long r);
 } interface Observer<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Disposable d);
 }
 
 interface Disposable {
 void dispose();
 } Observable Flowable
  • 62. Observing Sources interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void cancel();
 void request(long r);
 } interface Observer<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Disposable d);
 }
 
 interface Disposable {
 void dispose();
 } Observable Flowable
  • 63. • 當開始監聽資料時,會⾺馬上呼叫 onSubscribe。 Observing Sources interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void cancel();
 void request(long r);
 } interface Observer<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Disposable d);
 }
 
 interface Disposable {
 void dispose();
 } Observable Flowable
  • 64. interface Subscriber<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Subscription s);
 }
 
 interface Subscription {
 void cancel();
 void request(long r);
 } interface Observer<T> {
 void onNext(T t);
 void onComplete();
 void onError(Throwable t);
 void onSubscribe(Disposable d);
 }
 
 interface Disposable {
 void dispose();
 } Observable Flowable • 當開始監聽資料時,會⾺馬上呼叫 onSubscribe。 • Observer 可以利利⽤用 onSubscribe 提供的物件,呼叫 cancel 或是 backpressure。 Observing Sources
  • 65. Observing Sources Observable.just("Hello").subscribe(new Observer<String>() {
 @Override
 public void onNext(String value) {
 
 }
 @Override
 public void onComplete() {
 
 }
 @Override
 public void onError(Throwable e) {
 
 }
 @Override
 public void onSubscribe(Disposable d) {
 
 }
 });
  • 66. Observing Sources Observable.just("Hello").subscribe(new Observer<String>() {
 @Override
 public void onNext(String value) {
 
 }
 @Override
 public void onComplete() {
 
 }
 @Override
 public void onError(Throwable e) {
 
 }
 @Override
 public void onSubscribe(Disposable d) {
 
 }
 });
  • 67. Observing Sources Observable.just("Hello").subscribe(new DisposableObserver<String>() {
 @Override
 public void onNext(String value) {
 } 
 @Override
 public void onComplete() {
 }
 
 @Override
 public void onError(Throwable e) {
 }
 });
  • 68. Observing Sources DisposableObserver<String> observer = new DisposableObserver<String>() {
 @Override
 public void onNext(String value) {
 }
 
 @Override
 public void onComplete() {
 }
 
 @Override
 public void onError(Throwable e) {
 }
 }; 
 Observable.just(“Hello”).subscribe(observer);
  • 69. Observing Sources DisposableObserver<String> observer = new DisposableObserver<String>() {
 @Override
 public void onNext(String value) {
 }
 
 @Override
 public void onComplete() {
 }
 
 @Override
 public void onError(Throwable e) {
 }
 }; 
 Observable.just(“Hello”).subscribe(observer); // 如何 unsubscribe ?
  • 70. Observing Sources DisposableObserver<String> observer = new DisposableObserver<String>() {
 @Override
 public void onNext(String value) {
 }
 
 @Override
 public void onComplete() {
 }
 
 @Override
 public void onError(Throwable e) {
 }
 }; 
 Observable.just(“Hello").subscribe(observer); observer.dispose();
  • 71. Observing Sources Observable<String> o = Observable.just("Hello"); Disposable d = o.subscribeWith(new DisposableObserver<String>() {
 @Override
 public void onNext(String value) { … }
 @Override
 public void onComplete() { … }
 @Override
 public void onError(Throwable e) { … }
 }); d.dispose();
  • 72. Observing Sources Observable<String> o = Observable.just(“Hello"); Disposable d = o.subscribeWith(new DisposableObserver<String>() {
 @Override
 public void onNext(String value) { … }
 @Override
 public void onComplete() { … }
 @Override
 public void onError(Throwable e) { … }
 }); d.dispose(); New Method: subscribeWith
  • 73. Observing Sources Observable<String> o = Observable.just(“Hello"); Disposable d = o.subscribeWith(new DisposableObserver<String>() {
 @Override
 public void onNext(String value) { … }
 @Override
 public void onComplete() { … }
 @Override
 public void onError(Throwable e) { … }
 }); d.dispose(); 回傳 Disposable
  • 74. Observing Sources Observable<String> o = Observable.just(“Hello"); Disposable d = o.subscribeWith(new DisposableObserver<String>() {
 @Override
 public void onNext(String value) { … }
 @Override
 public void onComplete() { … }
 @Override
 public void onError(Throwable e) { … }
 }); d.dispose();
  • 75. Observing Sources Observable<String> o = Observable.just(“Hello”); CompositeDisposable disposables = new CompositeDisposable(); disposables.add(o.subscribeWith(new DisposableObserver<String>() {
 @Override
 public void onNext(String value) { … }
 @Override
 public void onComplete() { … }
 @Override
 public void onError(Throwable e) { … }
 })); disposables.dispose();
  • 76. Observing Sources Observable<String> o = Observable.just(“Hello”); CompositeDisposable disposables = new CompositeDisposable(); disposables.add(o.subscribeWith(new DisposableObserver<String>() {
 @Override
 public void onNext(String value) { … }
 @Override
 public void onComplete() { … }
 @Override
 public void onError(Throwable e) { … }
 })); disposables.dispose();
  • 77. Observing Sources Observable<String> o = Observable.just(“Hello”); CompositeDisposable disposables = new CompositeDisposable(); disposables.add(o.subscribeWith(new DisposableObserver<String>() {
 @Override
 public void onNext(String value) { … }
 @Override
 public void onComplete() { … }
 @Override
 public void onError(Throwable e) { … }
 })); disposables.dispose();
  • 78. Observing Sources Observable<String> o = Observable.just("Hello");
 o.subscribeWith(new DisposableObserver<String>() { … }); Maybe<String> m = Maybe.just("Hello");
 m.subscribeWith(new DisposableObserver<String>() { … }); Single<String> s = Single.just("Hello");
 s.subscribeWith(new DisposableObserver<String>() { … }); Completable<String> c = Completable.completed(“Hello");
 c.subscribeWith(new DisposableObserver<String>() { … });
  • 79. Observing Sources Flowable<String> f = Flowable.just("Hello");
 f.subscribeWith(new DisposableSubscriber<String>() { … }); Observable<String> o = Observable.just("Hello");
 o.subscribeWith(new DisposableObserver<String>() { … }); Maybe<String> m = Maybe.just("Hello");
 m.subscribeWith(new DisposableObserver<String>() { … }); Single<String> s = Single.just("Hello");
 s.subscribeWith(new DisposableObserver<String>() { … }); Completable<String> c = Completable.completed(“Hello");
 c.subscribeWith(new DisposableObserver<String>() { … }); • Flowable 也提供類似的 Disposable。
  • 80. RxJava • A set of classes for representing sources of data. • A set of classes for listening to data sources. • A set of methods for modifying and composing the data.
  • 81. Operators String normal = "hello";
 String upperCase = normal.toUpperCase();
  • 82. Operators String normal = "hello";
 String upperCase = normal.toUpperCase(); Observable<String> normal = Observable.just("hello");
 Observable<String> upperCase = normal.map(s -> s.toUpperCase());
  • 83. Operators Observable.fromCallable(new Callable<String>() {
 @Override
 public String call() throws Exception {
 // ...
 return result;
 }
 });
  • 84. Operators Observable.fromCallable(new Callable<String>() {
 @Override
 public String call() throws Exception {
 // ...
 return result;
 }
 }).subscribeOn(Schedulers.computation());
  • 85. Operators Observable.fromCallable(new Callable<String>() {
 @Override
 public String call() throws Exception {
 // ...
 return result;
 }
 }).subscribeOn(Schedulers.computation()); • 在 background thread 做事情。 bg thread
  • 86. Operators Observable.fromCallable(new Callable<String>() {
 @Override
 public String call() throws Exception {
 // ...
 return result;
 }
 }).subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); bg thread
  • 87. Operators Observable.fromCallable(new Callable<String>() {
 @Override
 public String call() throws Exception {
 // ...
 return result;
 }
 }).subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); • Observer 在 main thread 做事情。 bg thread main thread
  • 88. Operators Observable.fromCallable(new Callable<String>() {
 @Override
 public String call() throws Exception {
 // ...
 return result;
 }
 }).subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); • Observer 在 main thread 做事情。 main thread bg thread
  • 89. Operators Observable.fromCallable(() -> {
 return result;
 }).subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .map() .subscribe(observer);
  • 90. Operators Observable.fromCallable(() -> {
 return result;
 }).subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .map() .subscribe(observer); main thread
  • 91. Operators Observable.fromCallable(() -> {
 return result;
 }).subscribeOn(Schedulers.computation()) .map() .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer);
  • 92. Operators Observable.fromCallable(() -> {
 return result;
 }).subscribeOn(Schedulers.computation()) .map() .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); • Order 有關係 computation thread
  • 93. Operators Observable.fromCallable(() -> {
 return result;
 }).subscribeOn(Schedulers.computation()) .map() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer);
  • 94. Operators Observable.fromCallable(() -> {
 return result;
 }).subscribeOn(Schedulers.computation()) .map() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); computation thread
  • 95. Operators Observable.fromCallable(() -> {
 return result;
 }).subscribeOn(Schedulers.computation()) .map() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); ?? thread computation thread
  • 96. Operators Observable.fromCallable(() -> {
 return result;
 }).subscribeOn(Schedulers.computation()) .map() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); computation thread computation thread
  • 97. Operators Observable.fromCallable(() -> {
 return result;
 }).subscribeOn(Schedulers.computation()) .map() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); • 在同⼀一個 Source 中,subscribeOn 是先搶先贏。會依照第⼀一次 subscribeOn 的 schedulers 為準。 computation thread computation thread
  • 98. • RxJava 1.0 Operator: • first() - return Observable • takeFirst() - return Observable Operators
  • 99. • RxJava 1.0 Operator: • first() - return Observable • takeFirst() - return Observable • first():找出第⼀一個 element,如果沒有任何 item 則會回傳 error。 • takeFirst():找出第⼀一個 element,就算沒有拿到任何 item,也會 回傳 succeed。 Operators
  • 100. • RxJava 2.0 Operator: • firstOrError() - return Single • firstElement() - return Maybe Operators
  • 101. • RxJava 2.0 Operator: • firstOrError() - return Single • firstElement() - return Maybe • BJ4 Operators
  • 106. Being Reactive apiService.listToilets() .subscribeOn(Schedulers.io())
 .toSortedList(this::compareDistance) .observerOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver<String>() {
 @Override
 public void onNext(String value) {
 // Show toilets.
 }
 @Override
 public void onComplete() {/* ignore */}
 @Override
 public void onError(Throwable e) {/* show error */}
 });
  • 107. Being Reactive disposables.add(apiService.listToilets() .subscribeOn(Schedulers.io())
 .toSortedList(this::compareDistance) .observerOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver<String>() {
 @Override
 public void onNext(String value) {
 // Show toilets.
 }
 @Override
 public void onComplete() {/* ignore */}
 @Override
 public void onError(Throwable e) {/* show error */}
 }));
  • 108. Being Reactive // onCreate disposables.add(apiService.listToilets() .subscribeOn(Schedulers.io())
 .toSortedList(this::compareDistance) .observerOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver<String>() {
 @Override
 public void onNext(String value) {
 // Show toilets.
 }
 @Override
 public void onComplete() {/* ignore */}
 @Override
 public void onError(Throwable e) {/* show error */}
 })); // onDestory disposables.dispose();
  • 109. Architecture 2.x • 建立資料流(stream)時使⽤用更更少的資源。 • 監聽資料流時(stream)時負擔更更少。 • 更更有效率的 RxJava
  • 110. RxJava 2 • 撰寫程式的⽬目的是:能夠針對 Android 上的資料或UI變動時,做出應 有反應。 • ⽽而不是去主導或管理理這些變動。
  • 111. Reference • Exploring RxJava 2 for Android
 https://speakerdeck.com/jakewharton/exploring-rxjava-2-for- android-gotocph-october-2016 • RxJava Official wiki
 https://github.com/ReactiveX/RxJava/wiki/What's-different- in-2.0 • Reactive-streams API
 http://www.reactive-streams.org/reactive-streams-1.0.0- javadoc/