淺談RxJava

一年前莱没,自己搭建項目框架的時候,就已經(jīng)接觸用過RxJava酷鸦,并且還和Retrofit結合一起使用郊愧。然而卻并不清楚RxJava,到底是個啥子東西井佑,只知道按摸就樣的用著属铁。網(wǎng)上有篇文章對RxJava介紹很詳細 拋物線大神 ,一年前看這篇文章和現(xiàn)在看躬翁,有不同的收獲吧焦蘑。

那到底啥是RxJava? 官方介紹

a library for composing asynchronous and event-based programs by using observable sequences.

It extends the observer pattern to support sequences of data/events and adds operators 
that allow you to compose sequences together declaratively 
while abstracting away concerns about things
 like low-level threading, synchronization, thread-safety and concurrent data structures.

英語捉急,只能借助有道爸爸:

使用可觀察的序列來編寫異步和基于事件的程序的庫盒发。
它擴展了觀察者模式例嘱,以支持數(shù)據(jù)/事件的序列狡逢,并添加操作符,
使您能夠在抽象地消除對低層次線程拼卵、同步奢浑、線程安全和并發(fā)數(shù)據(jù)結構的關注時,以聲明的方式組合這些序列腋腮。

還是看不懂雀彼,看來語文也捉急。
網(wǎng)上說的最多的就是Rxjava的異步性即寡,當然同樣的可以實現(xiàn)異步常規(guī)操作徊哑,大多用AsyncTask / Handler 。既然市面上那么多人推崇Rxjava聪富,那它肯定有存在的必要莺丑。

廢話也不講,慢慢了解它
要學習Rxjava墩蔓,不得不知道這幾個對象:Observable/ Subscriber(可觀察者梢莽,即被觀察者,這兩者區(qū)別,后者增加訂閱和取消訂閱監(jiān)聽)奸披、 Observer (觀察者)蟹漓、 subscribe (訂閱)、事件源内。

這幾個對象的關系其實就和onClick類似,抽象的描述可以比喻:Observable 就像是直播平臺的主播份殿,Observer 則是用戶膜钓,通過用戶訂閱主播這個動作,兩者達成了一個聯(lián)系卿嘲。每次主播開播動作颂斜,就能通知到用戶這邊做對應動作,看直播或者做其他事情拾枣。與onClick比較沃疮,他強大之處,主播的動作也可以自定義梅肤,以及可以控制主播和用戶司蔬,具體在哪個線程中進行。我想這就是Rxjava的強大之一

基本實現(xiàn):

1.創(chuàng)建 Observe

Observer<String> observer = new Observer<String>() {
  @Override
  public void onNext(String s) {
      Log.d(tag, "Item: " + s);
  }

  @Override
  public void onCompleted() {
      Log.d(tag, "Completed!");
  }

  @Override
  public void onError(Throwable e) {
      Log.d(tag, "Error!");
  }
};

2.創(chuàng)建 Observable 另外還有 just/from 等創(chuàng)建方法就不一一闡述

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
  @Override
  public void call(Subscriber<? super String> subscriber) {
      subscriber.onNext("Hello world");
      subscriber.onCompleted();
  }
}); 

3.Subscribe (訂閱)

observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);

Subscribe內部源碼大致是這樣(copy拋物線大神,源碼實在太雜)

public Subscription subscribe(Subscriber subscriber) {
    subscriber.onStart();
    onSubscribe.call(subscriber);
    return subscriber;
}

Onstart執(zhí)行的類似Subscriber 的生命周期的概念姨蝴,這是一個可選方法俊啼,默認情況下它的實現(xiàn)為空。
.call(Subscriber)在這里左医,事件發(fā)送的邏輯開始運行授帕。從這也可以看出同木,在 RxJava 中, Observable 并不是在創(chuàng)建的時候就立即開始發(fā)送事件跛十,而是在它被訂閱的時候彤路,即當 subscribe() 方法執(zhí)行的時候。

線程控制 —— Scheduler

RxJava 另一個牛逼的地方芥映,就是線程的自由控制洲尊,多次切換線程。
** observeOn()** ** subscribeOn()** 兩個方法屏轰,指定對應的工作在指定的線程進行
示例代碼:

Observable.just(1, 2, 3, 4) // IO 線程颊郎,由 subscribeOn() 指定
    .subscribeOn(Schedulers.io())
    .observeOn(Schedulers.newThread())
    .map(mapOperator) // 新線程,由 observeOn() 指定
    .observeOn(Schedulers.io())
    .map(mapOperator2) // IO 線程霎苗,由 observeOn() 指定
    .observeOn(AndroidSchedulers.mainThread) 
.subscribe(subscriber);  // Android 主線程姆吭,由 observeOn() 指定

通過 observeOn() 的多次調用,程序實現(xiàn)了線程的多次切換唁盏,不同于 observeOn() 内狸, subscribeOn() 的位置放在哪里都可以,但它是只能調用一次的厘擂,當使用了多個 subscribeOn() 的時候昆淡,只有第一個 subscribeOn() 起作用
doOnSubscribe(): 如果在 doOnSubscribe() 之后有 subscribeOn() 的話,它將執(zhí)行在離它最近的 subscribeOn() 所指定的線程刽严。

操作符

RxJava 之所以強大昂灵,我覺得還因為他集成了各種API操作符,簡直不要太全舞萄。

普通操作符包括:interval眨补、repeat和intervalRange等。
變換操作符:map倒脓、flatMap撑螺、cast和concatMap等;這幾個已經(jīng)靈活用到各個應用場景
過濾操作符包括:filter崎弃、skip甘晤、take、element等等饲做。
組合操作符包括:merge线婚、startWidth、concat盆均、jion酌伊、switch和zip等等。
輔助操作符包括:DO、delay居砖、observeOn虹脯、timeout、timeInterval奏候、timestamp循集、subscribeOn、meterialize和to等蔗草。
錯誤操作符包括:catch和retry咒彤。
條件操作符包括:defaultEmpty、skipUntil咒精、amb镶柱、skipWhile、takeUtil模叙、takeWhile歇拆。
布爾操作符包括:all、isEmpty范咨、contains故觅、exists和sequenceEqual。
轉換操作符包括:toMap渠啊、toMultiMap输吏、toList、toSortedList替蛉、nest和getIterator等

以上是RxJava的最基礎的用法

下一篇開始談談在框架中RxJava結合Retrofit的使用

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末贯溅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子躲查,更是在濱河造成了極大的恐慌它浅,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熙含,死亡現(xiàn)場離奇詭異,居然都是意外死亡艇纺,警方通過查閱死者的電腦和手機怎静,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黔衡,“玉大人蚓聘,你說我怎么就攤上這事∶私伲” “怎么了夜牡?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我塘装,道長急迂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任蹦肴,我火速辦了婚禮僚碎,結果婚禮上,老公的妹妹穿的比我還像新娘阴幌。我一直安慰自己勺阐,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布矛双。 她就那樣靜靜地躺著渊抽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪议忽。 梳的紋絲不亂的頭發(fā)上懒闷,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音徙瓶,去河邊找鬼毛雇。 笑死,一個胖子當著我的面吹牛侦镇,可吹牛的內容都是我干的灵疮。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼壳繁,長吁一口氣:“原來是場噩夢啊……” “哼震捣!你這毒婦竟也來了?” 一聲冷哼從身側響起闹炉,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蒿赢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渣触,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羡棵,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年嗅钻,在試婚紗的時候發(fā)現(xiàn)自己被綠了皂冰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡养篓,死狀恐怖秃流,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情柳弄,我是刑警寧澤舶胀,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響嚣伐,放射性物質發(fā)生泄漏糖赔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一纤控、第九天 我趴在偏房一處隱蔽的房頂上張望挂捻。 院中可真熱鬧,春花似錦船万、人聲如沸刻撒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽声怔。三九已至,卻和暖如春舱呻,著一層夾襖步出監(jiān)牢的瞬間醋火,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工箱吕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芥驳,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓茬高,卻偏偏與公主長得像兆旬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子怎栽,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容

  • 我從去年開始使用 RxJava 丽猬,到現(xiàn)在一年多了。今年加入了 Flipboard 后熏瞄,看到 Flipboard 的...
    Jason_andy閱讀 5,462評論 7 62
  • 最近項目里面有用到Rxjava框架强饮,感覺很強大的巨作由桌,所以在網(wǎng)上搜了很多相關文章,發(fā)現(xiàn)一片文章很不錯邮丰,今天把這篇文...
    Scus閱讀 6,868評論 2 50
  • 前言我從去年開始使用 RxJava 行您,到現(xiàn)在一年多了。今年加入了 Flipboard 后柠座,看到 Flipboard...
    占導zqq閱讀 9,159評論 6 151
  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位邑雅,與響應式編程作為結合使用的片橡,對什么是操作妈经、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,851評論 0 10
  • 今天是周末,陽光顯得格外的明媚與燦爛。吃過早餐后吹泡,我便來到陽臺上骤星,想將這些花草與綠植都澆些水,然后爆哑,搬到陽臺外去曬...
    金陵雨兒閱讀 549評論 1 2