RxJava2 學習資料

僅作學習資料收集,請勿轉載,如需轉載請聯系原作者

原創 2017-09-01 鴻洋 鴻洋
昨天給大家推薦的巨大福利來襲,還記得去年的那個“玩Android”網站么?(可點擊訪問)

最近在看RxJava相關的文章,同事之前也做過一些分享,RxJava用起來還是非常爽的,尤其是一個頁面需要多個網絡請求,在控制這些訪問請求順序、并發請求、失敗重試、token生效等。

當前了,因為現在是已經更新到RxJava2了,所以本篇主要目前是RxJava2學習資源的推薦,后面有機會會針對各種場景寫一篇實戰類的文章。

先貼幾個必要的地址,以及wiki:

https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
https://github.com/JakeWharton/RxBinding
https://github.com/JakeWharton/RxRelay
https://github.com/ReactiveX/RxJava/wiki/Additional-Reading

可以在看完下面的入門資料后,細細的看下官方的相關文章。

1、0基礎到上手

這個非常推薦簡書作者Season_zlc的“水管”系列,相信很多人都看過,看完你就知道為什么叫“水管”系列了~~

給初學者的RxJava2.0教程(一)

http://www.lxweimin.com/p/464fa025229e

給初學者的RxJava2.0教程(二)

http://www.lxweimin.com/p/8818b98c44e2

給初學者的RxJava2.0教程(三)

http://www.lxweimin.com/p/128e662906af

給初學者的RxJava2.0教程(四)

http://www.lxweimin.com/p/bb58571cdb64

給初學者的RxJava2.0教程(五)

http://www.lxweimin.com/p/0f2d6c2387c9

給初學者的RxJava2.0教程(六)

http://www.lxweimin.com/p/e4c6d7989356

給初學者的RxJava2.0教程(七)

http://www.lxweimin.com/p/9b1304435564

給初學者的RxJava2.0教程(八)

http://www.lxweimin.com/p/a75ecf461e02

給初學者的RxJava2.0教程(九)

http://www.lxweimin.com/p/36e0f7f43a51


貼個二維碼可以直達。

接下來還有簡書作者南塵2251的RxJava2系列。

這可能是最好的RxJava 2.x 入門教程(一)

http://www.lxweimin.com/p/a93c79e9f689

這可能是最好的RxJava 2.x 入門教程(二)

http://www.lxweimin.com/p/b39afa92807e

這可能是最好的RxJava 2.x 入門教程(三)

http://www.lxweimin.com/p/e9c79eacc8e3

這可能是最好的RxJava 2.x 入門教程(四)

http://www.lxweimin.com/p/c08bfc58f4b6

這可能是最好的RxJava 2.x 入門教程(五)

http://www.lxweimin.com/p/81fac37430dd

GitHub 代碼同步更新:
https://github.com/nanchen2251/RxJava2Examples

完結版剛好本公眾號推送過,可以直接過去這可能是最好的 RxJava 2.x 入門教程(完結版)~

基本上看完就已經對RxJava2有一定的了解了,接下來就是異常強大的操作符的學習了~

2.操作符與實戰

CSDN作者余志強的RxJava2操作符系列:

RxJava create操作符的用法和源碼分析

http://blog.csdn.net/johnny901114/article/details/51524470

RxJava map操作符用法詳解

http://blog.csdn.net/johnny901114/article/details/51531348

RxJava flatMap操作符用法詳解

http://blog.csdn.net/johnny901114/article/details/51532776

RxJava concatMap操作符用法詳解

http://blog.csdn.net/johnny901114/article/details/51533282

RxJava onErrorResumeNext操作符實現app與服務器間token機制

http://blog.csdn.net/johnny901114/article/details/51533586

RxJava retryWhen操作符實現錯誤重試機制

http://blog.csdn.net/johnny901114/article/details/51539708

RxJava 使用debounce操作符優化app搜索功能

http://blog.csdn.net/johnny901114/article/details/51555203

RxJava concat操作處理多數據源

http://blog.csdn.net/johnny901114/article/details/51568562

RxJava zip操作符在Android中的實際使用場景

http://blog.csdn.net/johnny901114/article/details/51614927

RxJava switchIfEmpty操作符實現Android檢查本地緩存邏輯判斷

http://blog.csdn.net/johnny901114/article/details/52585912

RxJava defer操作符實現代碼支持鏈式調用

http://blog.csdn.net/johnny901114/article/details/52597643

combineLatest操作符的高級使用

http://blog.csdn.net/johnny901114/article/details/61191723

還有個非常給力的開源項目,“Learn RxJava By Samples”:

https://github.com/amitshekhariitbhu/RxJava2-Android-Samples

包含非常多的Sample,你也可以在它的README上獲得更多信息~

該篇是對該項目的記錄,方便速查:

RxJava 知識梳理(2) - RxJava2 操作符實踐

http://www.lxweimin.com/p/2ddd9bb8b1d7

該作者最近也在寫一些實戰類的文章:

RxJava2 實戰知識梳理(1) - 后臺執行耗時操作,實時通知 UI 更新

http://www.lxweimin.com/p/c935d0860186

RxJava2 實戰知識梳理(2) - 計算一段時間內數據的平均值

http://www.lxweimin.com/p/5dd01b14c02a

RxJava2 實戰知識梳理(3) - 優化搜索聯想功能

http://www.lxweimin.com/p/7995497baff5

RxJava2 實戰知識梳理(4) - 結合 Retrofit 請求新聞資訊

http://www.lxweimin.com/p/74f46ae1fabb

RxJava2 實戰知識梳理(5) - 簡單及進階的輪詢操作

http://www.lxweimin.com/p/fa1828d70192

RxJava2 實戰知識梳理(6) - 基于錯誤類型的重試請求

http://www.lxweimin.com/p/d135f19e045c

RxJava2 實戰知識梳理(7) - 基于 combineLatest 實現的輸入表單驗證

http://www.lxweimin.com/p/25682d620320

RxJava2 實戰知識梳理(8) - 使用 publish + merge 優化先加載緩存,再讀取網絡數據的請求過程

http://www.lxweimin.com/p/dfc11118b70b

3開源項目

優秀的項目很多推薦2個太多了也看不完~

就看天氣

就看天氣——是一款遵循 Material Design 風格的只看天氣的APP。

  • 卡片展現(當前天氣情況,未來幾小時天氣情況,生活建議,一周七天概況)

  • 緩存數據,減少網絡請求,保證離線查看

  • 內置兩套圖標(設置里更改)

https://github.com/xcc3641/SeeWeather

Paste_Image.png

極客日報

極客日報,一款純粹的閱讀App,基于Material Design + MVP + RxJava2 + Retrofit + Dagger2 + Realm + Glide
出于學習的目的做了這款Material Design風格的簡潔的閱讀應用,基本涵蓋了當前Android端開發最常用的主流框架,閱讀內容主要面向程序員/極客,目前包括:
知乎日報、微信精選、干貨集中營、稀土掘金、V2EX

https://github.com/codeestX/GeekNews

Paste_Image.png

4 源碼解析

推薦下張旭童的博客相信關注本公眾號的很多都看過旭童的文章

RxJava2 源碼解析(一)

http://blog.csdn.net/zxt0601/article/details/61614799

RxJava2 源碼解析(二)

http://blog.csdn.net/zxt0601/article/details/61637439

5.適用場景

[本文作者: 陽春面 本文鏈接: http://appkfz.com/2017/09/01/best-scene-use-rxjava/

版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協議。轉載請注明出處!]

下面我們開始介紹RxJava最適合使用的四種場景,代碼示例基于RxJava1

場景一: 單請求異步處理

由于在Android UI線程中不能做一些耗時操作,比如網絡請求,大文件保存等,所以在開發中經常會碰到異步處理的情況,我們最典型的使用場景是RxJava+Retrofit處理網絡請求

MyService myService = retrofit.create(MyService.class);
myService.getSomething()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::updateUI, this::showError);

為了使代碼看起來簡潔點,這邊還使用了lambda表達式, 
updateUI和 showError需要在當前類中實現,比如:

public void updateUI(Data data){      
//TODO something
}
public void showError(throwable t){      
//show error msg
}

場景二: 多異步請求連續調用

這種場景其實也很常見,我們做用戶頭像編輯的使用,一般就會有三個請求需要連續調用:

請求頭像上傳的地址
上傳頭像
更新用戶信息
在平時的代碼里,我們需要一步步callback嵌套下來,代碼冗長太難看,而且不好維護,使用RxJava鏈式調用處理代碼邏輯就會非常清晰

Observable.just(1)
  .map(this::task1)
  .map(this::task2)
  .map(this::task3)
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(this::updateUI,this::showError);
這里的just發送的固定值1,沒有實際意義,
只是我覺得這樣更信息 你也可以用Observable.create創建observable。

場景三: 多異步請求合并處理

有時候在項目中,我們會碰到組合多個請求的結果后,再更新UI的情況,比如我們項目中就有一個從多個請求地址獲取通知數據,然后在APP上再按時間順序組合后展示的需求,這時候我們就可以用RxJava的zip函數來處理了

MyService myService = retrofit.create(MyService.class);
Observable o1 = myService.getNotification1();
Observable o2 = myService.getNotification2();
Observable.zip(o1,o2, this::combiNotification)
             .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::updateUI,this::showError);
public List<Notification> combiNotification(List<Notification> n1, 
List<Notification> n2){      
//TODO 合并通知列表
}
zip函數會等待兩個請求都完成后,調用我們的合并方法combiNotification,等合并處理后再回調subscribe中的方法。

場景四: 定時輪詢

RxJava還特別適合對定時輪詢任務的處理, 一種典型的例子就是APP提交了一個任務給后臺異步處理,假設后臺處理需要1-2分鐘左右,我們需要定時到后臺查詢進度,并更新到UI上, 傳統的做法是用Handler的postDelay方法,用RxJava實現的話就會非常簡潔

Subscription subscription =  Observable.interval(2, TimeUnit.SECONDS)
                .map(this::getProgress)
               .takeUntil(progress -> progress !=  100)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Long>() {                    
                  @Override
                  public void onCompleted() {                       
                  //TODO finished                    }
                    
                 @Override
                 publi void onError(Throwable e) {                    }
                    
                 @Override       
                 public void onNext(int progress) {                         
                //TODO update progress
                    }
                });
我們以定時2秒查詢一次,直到進度progress=100為止,自動終止輪詢。

以上各種RxJava方法都是異步耗時調用,考慮到Activity的退出時請求還沒有完成,我們需要在Activity的OnDestroy方法中取消RxJava調用

subscription.unsubscribe();

本文作者: 陽春面本文鏈接: http://appkfz.com/2017/09/01/best-scene-use-rxjava/版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協議。轉載請注明出處!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容