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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

RxJava初级解析(一)

發布時間:2025/4/16 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RxJava初级解析(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
扔物線大大的文章確實寫的牛 扔物線,看了他的文章受益匪淺,文中很多會引用到他的一些分析,沒有看過他的文章的建議先看一下。

一.概述

先簡單介紹一下RxJava的思想

RxJava 有四個基本概念:Observable (可觀察者,即被觀察者)、 Observer (觀察者)、 subscribe (訂閱)、事件。Observable 和 Observer 通過 subscribe() 方法實現訂閱關系,從而 Observable 可以在需要的時候發出事件來通知 Observer。

概念介紹

1.Observable(可觀察者,即被觀察者)

事件的觸發者。

2.Observer/Subscriber(觀察者)

事件的產生者

3.subscribe(訂閱)

可被觀察者和觀察者之間的橋梁

4.事件

產生的事件

5.總結

舉個例子:我是一名讀者雜志會員,我想訂閱讀者期刊,當我訂閱之后,讀者工作室就會每個月給我發一本讀者雜志。在這個事件中,我就是一名被觀察者,讀者工作室就是觀察者,因為我一旦產生訂閱這件事,就會觸發讀者工作室的一系列動作。

二.實例解析

1.最簡單的例子

observable(可被觀察者)

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {@Overridepublic void call(Subscriber<? super String> subscriber) {subscriber.onNext("test1");subscriber.onNext("test2");subscriber.onCompleted();}});

subscriber/observer(觀察者)

private Subscriber<String> subscribe = new Subscriber<String>() {@Overridepublic void onCompleted() {Log.e("HP", "onCompleted");}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(String s) {Log.e("HP", s);} };

subscribe(訂閱)

observable.subscribe(subscribe);

執行以上代碼會打印出如下結果

test1 test2 onCompleted

這樣一個最簡單的RxJava代碼就完成了。

為什么在call方法中調用onNext(),onCompleted()會觸發subscriber/observer中對應的方法呢?接下來一起看一下源碼,看看是如何訂閱成功的。

進入到Observable.create()方法

public final static <T> Observable<T> create(OnSubscribe<T> f) {return new Observable<T>(hook.onCreate(f));} protected Observable(OnSubscribe<T> f) {this.onSubscribe = f; }

這里創建了一個Observable對象,同時通過構造函數將 f 賦值給Observalbe類中的onSubscribe

進入到subscribe方法

public final Subscription subscribe(Subscriber<? super T> subscriber) {return Observable.subscribe(subscriber, this);}private static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {// validate and proceedif (subscriber == null) {throw new IllegalArgumentException("observer can not be null");}if (observable.onSubscribe == null) {throw new IllegalStateException("onSubscribe function can not be null.");/** the subscribe function can also be overridden but generally that's not the appropriate approach* so I won't mention that in the exception*/}// new Subscriber so onStart itsubscriber.onStart();/** See https://github.com/ReactiveX/RxJava/issues/216 for discussion on "Guideline 6.4: Protect calls* to user code from within an Observer"*/// if not already wrappedif (!(subscriber instanceof SafeSubscriber)) {// assign to `observer` so we return the protected versionsubscriber = new SafeSubscriber<T>(subscriber);}// The code below is exactly the same an unsafeSubscribe but not used because it would // add a significant depth to already huge call stacks.try {// allow the hook to intercept and/or decoratehook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);return hook.onSubscribeReturn(subscriber);} catch (Throwable e) {// special handling for certain Throwable/Error/Exception typesExceptions.throwIfFatal(e);// if an unhandled error occurs executing the onSubscribe we will propagate ittry {subscriber.onError(hook.onSubscribeError(e));} catch (Throwable e2) {Exceptions.throwIfFatal(e2);// if this happens it means the onError itself failed (perhaps an invalid function implementation)// so we are unable to propagate the error correctly and will just throwRuntimeException r = new RuntimeException("Error occurred attempting to subscribe [" + e.getMessage() + "] and then again while trying to pass to onError.", e2);// TODO could the hook be the cause of the error in the on error handling.hook.onSubscribeError(r);// TODO why aren't we throwing the hook's return value.throw r;}return Subscriptions.unsubscribed();}}

我們看到

hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);

其中hook.onSubscribeStart返回的是create()方法中創建的OnSubscribe對象,即上文中提到的 onSubscribe ,在這里調用OnSubscribe 中的call方法,將subscriber/observer傳遞到call方法中,所以我們在call中調用onNext(),onError(),onCompleted()會觸發observer中對應的方法,從而達到了事件通知的效果。

2.訂閱Action

觀察者除了我們的subscriber/observer之外,還可以是Action

再看一個例子
定義一個action

private Action1<String> action1 = new Action1<String>() {@Overridepublic void call(String s) {Log.e("HP",s);} }; observable.subscribe(action1);

再看輸出結果

test1 test2

不出所料,輸出結果與預期的相同。
進入subscribe方法看以看究竟

public final Subscription subscribe(final Action1<? super T> onNext) {if (onNext == null) {throw new IllegalArgumentException("onNext can not be null");}return subscribe(new Subscriber<T>() {@Overridepublic final void onCompleted() {// do nothing}@Overridepublic final void onError(Throwable e) {throw new OnErrorNotImplementedException(e);}@Overridepublic final void onNext(T args) {onNext.call(args);}});

原來在subscribe方法中將我們的action轉換成了subscribe。
所以通過action你可以自定義一些實現onNext(),onError(),onComplete()方法的action,這些action通常是可以作為公用的操作。

這些僅僅是RxJava最基礎用法的一個解析。

總結

以上是生活随笔為你收集整理的RxJava初级解析(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产超碰在线观看 | 有机z中国电影免费观看 | 亚洲国产精品综合久久久 | 欧美日韩18 | 一级片毛片| 蜜桃av噜噜一区二区三区网址 | 黄网在线免费 | 色先锋av| 国产高清片 | 日日摸日日碰 | 欧美日韩激情一区 | 影音先锋久久久久av综合网成人 | 欧美日韩一级片在线观看 | 中文字幕久久精品 | 白丝一区 | 亚洲国产精品欧美久久 | 中国男人操女人 | 在线成人亚洲 | 欧美日韩久久精品 | 香蕉视频官网在线观看 | 国产丰满麻豆 | 亚洲人成久久 | 国产一二三区免费视频 | 天堂中文在线最新 | 清草视频| 亚洲伊人久久综合 | av日日操| 亚洲另类天堂 | 综合精品久久 | 日本精品久久久久中文字幕 | 黄色大片久久 | 中国免费一级片 | 欧美又粗又大xxxxbbbb疯狂 | 日本xxxwww| 黄视频免费观看 | 欧美在线观看一区二区三区 | 精产国品一区二区三区 | 免费网站观看www在线观 | 人妻中文字幕一区二区三区 | 天堂网wwww| 亚洲欧美综合另类 | 伊人二区| 巨乳美女在线 | 黄色的网站在线 | 色综合色综合网色综合 | 日本黄网站 | 久草网址 | 青青成人 | 欧美激情欧美激情在线五月 | 秋霞在线一区二区 | 亚洲女优视频 | 成人三级电影网站 | 美女视频久久 | 黄色在线观看av | 二区视频在线观看 | 阿娇全套94张未删图久久 | 日韩免费电影一区 | 天堂成人在线观看 | 国产理论一区 | 国产精品2018 | 香港三日本8a三级少妇三级99 | 久久性色| 免费成人深夜夜国外 | 亚洲自拍偷拍一区 | 国产在线观看无码免费视频 | 一区二区伊人 | 在线免费观看国产 | 春闺艳妇(h)高h产乳 | 激情伊人五月天 | 免费在线观看网址 | 亚洲综合激情在线 | а√天堂资源在线 | 日本高潮视频 | 蜜桃成人网 | 成人免费毛片视频 | 在线看成人 | 在线看黄网 | 欧洲av片 | 国产精品aaa | 青青草综合视频 | 一区二区日韩电影 | 亚洲射射射| 午夜精品免费观看 | 国产影视一区二区三区 | 久久精品国产99久久久 | 成人无码久久久久毛片 | 黄色av片三级三级三级免费看 | 玩偶姐姐在线观看免费 | 色99在线| 怡红院男人的天堂 | 中文字幕线人 | 天堂在线资源8 | 欧美激情在线一区 | 国产美女又黄又爽又色视频免费 | 亚洲精选久久久 | 视频这里只有精品 | 色黄大色黄女片免费中国 | 婷婷丁香社区 | 亚洲激情在线 |