最適合使用RxJava處理的四種場景
RxJava是非常熱門的函數(shù)響應(yīng)式編程庫,在Android開發(fā)中已經(jīng)非常流行了,剛開始上手會有點難,但只要理解了它,就再也回不去了;不使用RxJava寫異步請求的話,就感覺各種不爽。
本文不準(zhǔn)備講RxJava的基礎(chǔ)知識,如果你對RxJava不熟悉,這里有篇不錯的教程可以參考 《給 Android 開發(fā)者的 RxJava 詳解》 。
下面我們開始介紹RxJava最適合使用的四種場景,代碼示例基于RxJava1
場景一: 單請求異步處理
由于在Android UI線程中不能做一些耗時操作,比如網(wǎng)絡(luò)請求,大文件保存等,所以在開發(fā)中經(jīng)常會碰到異步處理的情況,我們最典型的使用場景是RxJava+Retrofit處理網(wǎng)絡(luò)請求
MyService myService = retrofit.create(MyService.class);
myService.getSomething()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::updateUI, this::showError);
為了使代碼看起來簡潔點,這邊還使用了lambda表達式, updateUI 和 showError 需要在當(dāng)前類中實現(xiàn),比如:
public void updateUI(Data data){
      //TODO something
}
public void showError(throwable t){
      //show error msg
}
場景二: 多異步請求連續(xù)調(diào)用
這種場景其實也很常見,我們做用戶頭像編輯的使用,一般就會有三個請求需要連續(xù)調(diào)用:
- 請求頭像上傳的地址
 - 上傳頭像
 - 更新用戶信息
 
在平時的代碼里,我們需要一步步callback嵌套下來,代碼冗長太難看,而且不好維護,使用RxJava鏈?zhǔn)秸{(diào)用處理代碼邏輯就會非常清晰
Observable.just(1) .map(this::task1) .map(this::task2) .map(this::task3) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::updateUI, this::showError);
這里的just發(fā)送的固定值1,沒有實際意義,只是我覺得這樣更信息
你也可以用Observable.create創(chuàng)建observable。
場景三: 多異步請求合并處理
有時候在項目中,我們會碰到組合多個請求的結(jié)果后,再更新UI的情況,比如我們項目中就有一個從多個請求地址獲取通知數(shù)據(jù),然后在APP上再按時間順序組合后展示的需求,這時候我們就可以用RxJava的zip函數(shù)來處理了
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函數(shù)會等待兩個請求都完成后,調(diào)用我們的合并方法combiNotification,等合并處理后再回調(diào)subscribe中的方法。
場景四: 定時輪詢
RxJava還特別適合對定時輪詢?nèi)蝿?wù)的處理, 一種典型的例子就是APP提交了一個任務(wù)給后臺異步處理,假設(shè)后臺處理需要1-2分鐘左右,我們需要定時到后臺查詢進度,并更新到UI上, 傳統(tǒng)的做法是用Handler的postDelay方法,用RxJava實現(xiàn)的話就會非常簡潔
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方法都是異步耗時調(diào)用,考慮到Activity的退出時請求還沒有完成,我們需要在Activity的OnDestroy方法中取消RxJava調(diào)用
subscription.unsubscribe();















 
 
 






 
 
 
 