本文不許備講RxJava的基礎知識,若是你對RxJava不熟悉,這裏有篇不錯的教程能夠參考《給 Android 開發者的 RxJava 詳解》。java
下面咱們開始介紹RxJava最適合使用的四種場景,代碼示例基於RxJava1編程
因爲在Android UI線程中不能作一些耗時操做,好比網絡請求,大文件保存等,因此在開發中常常會碰到異步處理的狀況,咱們最典型的使用場景是RxJava+Retrofit處理網絡請求bash
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鏈式調用處理代碼邏輯就會很是清晰app
MyService myService = retrofit.create(MyService.class);
myService.getUploadUrl()
.flatMap(this::uploadImageTask)
.flatMap(this::updateUserInfo)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::updateUI, this::showError);複製代碼
先獲取請求,再上傳頭像,最後更新用戶信息,後面的任務依賴上一步的處理結果,依次執行。異步
有時候在項目中,咱們會碰到組合多個請求的結果後,再更新UI的狀況,好比咱們項目中就有一個從多個請求地址獲取通知數據,而後在APP上再按時間順序組合後展現的需求,這時候咱們就能夠用RxJava的zip函數來處理了ide
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實現的話就會很是簡潔post
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
public void onError(Throwable e) {
}
@Override
public void onNext(int progress) {
//TODO update progress
}
});複製代碼
咱們以定時2秒查詢一次,直到進度progress=100爲止,自動終止輪詢。
以上各類RxJava方法都是異步耗時調用,考慮到Activity的退出時請求尚未完成,咱們須要在Activity的OnDestroy方法中取消RxJava調用
subscription.unsubscribe();複製代碼
本文做者: 陽春麪
本文連接: appkfz.com/2017/09/01/…
版權聲明: 本博客全部文章除特別聲明外,均採用 CC BY-NC-SA 3.0 許可協議。轉載請註明出處!
掃一掃下方二維碼,關注個人微信公衆號(APP開發進階),第一時間得到Android開發進階文章