日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

RxJava 教程第一部分:入门之 生命周期管理

發(fā)布時間:2025/4/16 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RxJava 教程第一部分:入门之 生命周期管理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文出處: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: 2

onError 和 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é)果:

Clean

Subscriptions.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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。