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 許可協議。轉載請注明出處!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容