RxJava 教程第一部分:入门之 生命周期管理
原文出處:http://blog.chengyunfeng.com/?p=954#ixzz4KaYiN2oT
Rx 背后的理念是:無法知道事件流何時發(fā)射數(shù)據(jù)、也不知何時結(jié)束發(fā)射,但是你需要控制何時開始和結(jié)束接受事件。訂閱者可能使用了一些資源,這些資源需要在停止接收事件的時候釋放。 通過 subscription 可以實現(xiàn)生命周期管理。
Subscribing
Observable.subscribe 有好幾個重載函數(shù),每個函數(shù)都是某種情況的簡化形式。
Subscription subscribe() Subscription subscribe(Action1<? super T> onNext) Subscription subscribe(Action1<? super T> onNext, Action1<java.lang.Throwable> onError) Subscription subscribe(Action1<? super T> onNext, Action1<java.lang.Throwable> onError, Action0 onComplete) Subscription subscribe(Observer<? super T> observer) Subscription subscribe(Subscriber<? super T> subscriber)第一個 subscribe() 函數(shù)只是訂閱事件,但是不去處理這些事件。帶有一個或者多個 Action 參數(shù)的,使用這些參數(shù)來構(gòu)造一個 Subscriber 對象。這些參數(shù)分別對應(yīng) onNext、onError和 onComplete 這三種類型的事件,如果沒有提供則代表不處理這個類型的事件。
下面的示例演示處理 error 的情況:
Subject<Integer, Integer> s = ReplaySubject.create(); s.subscribe(v -> System.out.println(v),e -> System.err.println(e)); s.onNext(0); s.onError(new Exception("Oops"));結(jié)果:
0 java.lang.Exception: Oops如果你不處理 error,則 在發(fā)生錯誤的時候,會拋出 OnErrorNotImplementedException 異常。該異常發(fā)生在生產(chǎn)者這邊,上面的示例 生產(chǎn)者和消費者位于同一線程,所以你可以直接 try- catch 住,但是在實際應(yīng)用中,生產(chǎn)者和消費者通常不再同一個線程,所以最好還是提供一個 錯誤處理函數(shù),否則你不知道錯誤發(fā)生了并導(dǎo)致事件流結(jié)束了。
Unsubscribing
在事件流結(jié)束發(fā)射之前,你可以主動停止接收事件。每個 subscribe 函數(shù)都會返回一個 Subscription 示例,該示例有兩個函數(shù):
boolean isUnsubscribed() void unsubscribe()只需要調(diào)用 unsubscribe 函數(shù)就可以停止接收數(shù)據(jù)了。
Subject<Integer, Integer> values = ReplaySubject.create(); Subscription subscription = values.subscribe(v -> System.out.println(v),e -> System.err.println(e),() -> System.out.println("Done") ); values.onNext(0); values.onNext(1); subscription.unsubscribe(); values.onNext(2);結(jié)果:
0 1一個 observer 調(diào)用 unsubscribe 取消監(jiān)聽并不妨礙同一個 observable 上的其他 Observer 對象。
Subject<Integer, Integer> values = ReplaySubject.create(); Subscription subscription1 = values.subscribe(v -> System.out.println("First: " + v) ); Subscription subscription2 = values.subscribe(v -> System.out.println("Second: " + v) ); values.onNext(0); values.onNext(1); subscription1.unsubscribe(); System.out.println("Unsubscribed first"); values.onNext(2);結(jié)果:
First: 0 Second: 0 First: 1 Second: 1 Unsubscribed first Second: 2onError 和 onCompleted
onError 和 onCompleted 意味著結(jié)束事件流。observable 需要遵守該規(guī)范,在 onError 或者 onCompleted 發(fā)生后就不應(yīng)該再發(fā)射事件了。
Subject<Integer, Integer> values = ReplaySubject.create(); Subscription subscription1 = values.subscribe(v -> System.out.println("First: " + v),e -> System.out.println("First: " + e),() -> System.out.println("Completed") ); values.onNext(0); values.onNext(1); values.onCompleted(); values.onNext(2);結(jié)果:
First: 0 First: 1 Completed釋放資源
Subscription 和其使用的資源綁定在一起。所以你應(yīng)該記得釋放 Subscription 來釋放資源。使用 Subscriptions 的工廠函數(shù)可以把 Subscription 和需要的資源綁定在一起,然后可以使用 unsubscribe 來釋放綁定的資源。
Subscription s = Subscriptions.create(() -> System.out.println("Clean")); s.unsubscribe();結(jié)果:
CleanSubscriptions.create 函數(shù)需要一個 Action 接口類型參數(shù),在 unsubscribe 調(diào)用的時候會執(zhí)行該接口來釋放資源。 也有其他一些函數(shù)可以簡化開發(fā):
- Subscriptions.empty() 返回一個當(dāng) unsubscribe 的時候 啥也不做的Subscription 。當(dāng)要求你返回一個 Subscription ,但是你確沒有資源需要釋放,則可以返回這個空的 Subscription。
- Subscriptions.from(Subscription… subscriptions),返回的 Subscription 釋放的時候,會調(diào)用所有參數(shù) Subscription 的 unsubscribe 函數(shù)。
- Subscriptions.unsubscribed() 返回一個已經(jīng)釋放過的 Subscription。
Subscription 也有一些標(biāo)準(zhǔn)的實現(xiàn):
- BooleanSubscription
- CompositeSubscription
- MultipleAssignmentSubscription
- RefCountSubscription
- SafeSubscriber
- Scheduler.Worker
- SerializedSubscriber
- SerialSubscription
- Subscriber
- TestSubscriber
在后面將會看到他們的使用方式。這里注意 Subscriber 同時也實現(xiàn)了 Subscription。所以我們也可以直接用 Subscriber 來取消監(jiān)聽。
總結(jié)
以上是生活随笔為你收集整理的RxJava 教程第一部分:入门之 生命周期管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RxJava 教程第一部分:入门之 关键
- 下一篇: Data Binding Library