僅作學習資料收集,請勿轉載,如需轉載請聯系原作者
原創 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
極客日報
極客日報,一款純粹的閱讀App,基于Material Design + MVP + RxJava2 + Retrofit + Dagger2 + Realm + Glide
出于學習的目的做了這款Material Design風格的簡潔的閱讀應用,基本涵蓋了當前Android端開發最常用的主流框架,閱讀內容主要面向程序員/極客,目前包括:
知乎日報、微信精選、干貨集中營、稀土掘金、V2EX
https://github.com/codeestX/GeekNews
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 許可協議。轉載請注明出處!