RxAndroid 1.0,2.0版本以及主要原理

參考學(xué)習(xí)資料 1.0版本

http://gank.io/post/560e15be2dca930e00da1083 扔物線
https://github.com/lzyzsd/Awesome-RxJava 大頭鬼

一蛤迎、基礎(chǔ)
 Observables(被觀察者承边,事件源)和Subscribers(觀察者)Observables發(fā)出一系列事件匠题,Subscribers處理這些事件

一個Observable可以發(fā)出零個或者多個事件泰偿,知道結(jié)束或者出錯麻献。每發(fā)出一個事件,就會調(diào)用它的Subscriber的onNext方法徊件,最后調(diào)用Subscriber.onNext()或者Subscriber.onError()結(jié)束梭依。

建議先看大頭鬼的hello world 的例子 (建議碼一遍)
http://blog.csdn.net/lzyzsd/article/details/41833541

Action1<String> onNextAction=new Action1<String>() {   
 @Override    public void call(String s) {   
     System.out.println(s);   
 }};

應(yīng)用場景

1.Observable和Subscriber可以做任何事情Observable可以是一個數(shù)據(jù)庫查詢卖擅,Subscriber用來顯示查詢結(jié)果鸣奔;Observable可以是屏幕上的點擊事件,Subscriber用來響應(yīng)點擊事件惩阶;Observable可以是一個網(wǎng)絡(luò)請求挎狸,Subscriber用來顯示請求結(jié)果。

 left原理:都是基于一個lift(operator)
 *  Observable 在執(zhí)行了left之后断楷, 會返回一個新的Observable,這個Observable就像一個代理一樣锨匆,負責(zé)接受原始的Observable發(fā)出的事件。并在處理后發(fā)送給Subscriber冬筒。更像是一種代理機制恐锣,通過事件攔截和處理實現(xiàn)時間序列的變換。
  subscribeOn()和 observeOn區(qū)別:
 *  1.subscribeOn()線程切換發(fā)生在Onsubscribe中舞痰,即在它通知上一級OnSubscribe時侥蒙,這時事件還沒有開始發(fā)送,因此subscribeOn()的線程控制匀奏,
 * 可以從事件發(fā)出的開端就做成了影響。
 * 2.observeOn()的線程切換發(fā)送在它內(nèi)建Subscriber中学搜,即發(fā)生在它即將給下一級Subscriber發(fā)送事件時娃善,因此observeOn()控制的是它后面的線程。
 *

Observable.doOnSubscribe() 和 Subscriber.onStart() 同樣是在 subscribe() 調(diào)用后而且在事件發(fā)送前執(zhí)行, 但是Observable.doOnSubscribe()可以指定線程瑞佩,默認情況下聚磺, doOnSubscribe() 執(zhí)行在 subscribe() 發(fā)生的線程;而如果在 doOnSubscribe() 之后有 subscribeOn() 的話炬丸,它將執(zhí)行在離它最近的 subscribeOn() 所指定的線程瘫寝。

2.0版本###

導(dǎo)包給我搞吐
包名開頭 最舊 rx-->io 最新

2.0 最核心的是Publisher 和 Subscriber蜒蕾。 Publisher 發(fā)出一系列的時間,Subscriber負責(zé)和處理事件焕阿。

具體講解

背壓#####

在rxjava中有多重控制流以及背壓(backpressure)策略用來應(yīng)對當(dāng)一個快速發(fā)送消息的被觀察者遇到一個處理消息緩慢的觀察者咪啡。

Flowable的三種Backpressure策略:

BackpressureStrategy.BUFFER####

onBackpressureBuffer是不丟棄數(shù)據(jù)的處理方式。把上游收到的全部緩存下來暮屡,等下游來請求再發(fā)給下游撤摸。相當(dāng)于一個水庫。但上游太快褒纲,水庫(buffer)就會溢出准夷。

BackpressureStrategy.DROP####

BackpressureStrategy.LATEST####

Drop 和Latest 類似,都會丟棄數(shù)據(jù)莺掠,下游通過request請求產(chǎn)生令牌給上游衫嵌,上游接收到多少令牌,就發(fā)送多少彻秆,當(dāng)令牌為0的時候楔绞,上游開始丟棄數(shù)據(jù)。區(qū)別在于掖棉,drop直接丟棄數(shù)據(jù)不緩存數(shù)據(jù)墓律。而latest緩存最新的一條數(shù)據(jù),當(dāng)上游收到令牌幔亥,就把緩存的上一條“最新”數(shù)據(jù)發(fā)送給下游耻讽。

何時用Observable####

當(dāng)上游在一段時間發(fā)送的數(shù)據(jù)量不大(以1000為界限)的時候優(yōu)先選擇使用Observable;
在處理GUI相關(guān)的事件帕棉,比如鼠標(biāo)移動或觸摸事件针肥,這種情況下很少會出現(xiàn)backpressured的問題,用Observable就足以滿足需求香伴;
獲取數(shù)據(jù)操作是同步的慰枕,但你的平臺不支持Java流或者相關(guān)特性。使用Observable的開銷低于Flowable即纲。

何時用Flowable####

當(dāng)上游在一段時間發(fā)送的數(shù)據(jù)量過大的時候(這個量我們往往無法預(yù)計)具帮,此時就要使用Flowable以限制它所產(chǎn)生的量的元素10K +處理。
當(dāng)你從本地磁盤某個文件或者數(shù)據(jù)庫讀取數(shù)據(jù)時(這個數(shù)據(jù)量往往也很大)低斋,應(yīng)當(dāng)使用Flowable蜂厅,這樣下游可以根據(jù)需求自己控制一次讀取多少數(shù)據(jù);
以讀取數(shù)據(jù)為主且有阻塞線程的可能時用Flowable膊畴,下游可以根據(jù)某種條件自己主動讀取數(shù)據(jù)掘猿。

在RxJava2.0中,有五種觀察者模式:####

Observable/Observer
Flowable/Subscriber

Single/SingleObserver
Completable/CompletableObserver
Maybe/MaybeObserver

Observable 寫法:####

Observable-->Observer

Observable.create(new ObservableOnSubscribe<Integer>() {
    @Override
    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
        emitter.onNext(1);
        emitter.onNext(2);
        emitter.onComplete();
    }
}).subscribe(new Observer<Integer>() {
    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(Integer integer) {

    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onComplete() {

    }
});

Flowable寫法###

Flowable-->subscriber

Flowable.range(0, 10)
        .subscribe(new Subscriber<Integer>() {
            Subscription subscription;

            //當(dāng)訂閱后唇跨,會首先調(diào)用這個方法稠通,其實就相當(dāng)于onStart()衬衬,
            //傳入的Subscription s參數(shù)可以用于請求數(shù)據(jù)或者取消訂閱
            @Override
            public void onSubscribe(Subscription s) {
                Log.d(TAG, "onsubscribe start");
     ## 這里需要特別注意。s.request()去請求資源改橘,參數(shù)就是要請求的數(shù)量滋尉,一般如果不限制,寫成Long.MAX_VALUE唧龄。如果不調(diào)用request, onNext()和onComplete方法將不會被調(diào)用兼砖。
                subscription = s;
                subscription.request(1);
                Log.d(TAG, "onsubscribe end");
            }

            @Override
            public void onNext(Integer o) {
## onNext 方法里面?zhèn)魅氲膮?shù)就是Flowable 中發(fā)射出來的。
                Log.d(TAG, "onNext--->" + o);
                subscription.request(3);
            }

            @Override
            public void onError(Throwable t) {
                t.printStackTrace();
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "onComplete");
            }
        });

如果只關(guān)注onNext()既棺,可以

Consumer consumer=new Consumer<String>(){
  @Override
  public void accept(String s) throws Exception{
    System.out.println(s);
  }
}
Actions

為了減少組件數(shù)量讽挟,2.x中沒有定義Action3-Action9和ActionN。

保留的action接口按照Java 8 functional風(fēng)格命名丸冕。 無參數(shù)的Action0 被操作符io.reactivex.functions.Action和Scheduler代替耽梅。

Action1被重命名為Consumer。Action2 被重命名為BiConsumer胖烛。 ActionN 被Consumer<Object[]> 代替眼姐。##

Functions

我們按照Java 8的命名風(fēng)格定義了io.reactivex.functions.Function 和io.reactivex.functions.BiFunction, 把Func3 - Func9 分別改成了 Function3 - Function9 。FuncN被Function<Object[], R>代替佩番。

此外众旗,操作符不再使用Func1<T, Boolean>但原始返回類型為Predicate<T>。

io.reactivex.functions.Functions類提供了常見的轉(zhuǎn)換功能Function<Object[], R>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趟畏,一起剝皮案震驚了整個濱河市贡歧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赋秀,老刑警劉巖利朵,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猎莲,居然都是意外死亡绍弟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門著洼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來樟遣,“玉大人,你說我怎么就攤上這事身笤”” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵展鸡,是天一觀的道長。 經(jīng)常有香客問我埃难,道長莹弊,這世上最難降的妖魔是什么涤久? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮忍弛,結(jié)果婚禮上响迂,老公的妹妹穿的比我還像新娘。我一直安慰自己细疚,他們只是感情好蔗彤,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疯兼,像睡著了一般然遏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吧彪,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天待侵,我揣著相機與錄音,去河邊找鬼姨裸。 笑死秧倾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的傀缩。 我是一名探鬼主播那先,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赡艰!你這毒婦竟也來了售淡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞄摊,失蹤者是張志新(化名)和其女友劉穎勋又,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體换帜,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡楔壤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惯驼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹲嚣。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖祟牲,靈堂內(nèi)的尸體忽然破棺而出隙畜,到底是詐尸還是另有隱情,我是刑警寧澤说贝,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布议惰,位于F島的核電站,受9級特大地震影響乡恕,放射性物質(zhì)發(fā)生泄漏言询。R本人自食惡果不足惜俯萎,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望运杭。 院中可真熱鬧夫啊,春花似錦、人聲如沸辆憔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虱咧。三九已至熊榛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彤钟,已是汗流浹背来候。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逸雹,地道東北人营搅。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像梆砸,于是被迫代替她去往敵國和親转质。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容