最適合使用RxJava處理的四種情境

來源:互聯網
上載者:User

標籤:函數   some   需要   沒有   方法   call   seconds   sub   task   

下面我們開始介紹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運算式,updateUIshowError需要在當前類中實現,比如:

public void updateUI(Data data){
//TODO something
}

public void showError(throwable t){
//show error msg
}
情境二: 多非同步請求連續調用

這種情境其實也很常見,我們做帳戶圖片編輯的使用,一般就會有三個請求需要連續調用:

  1. 要求標頭像上傳的地址
  2. 上傳頭像
  3. 更新使用者資訊

在平時的代碼裡,我們需要一步步callback嵌套下來,代碼冗長太難看,而且不好維護,使用RxJava鏈式調用處理代碼邏輯就會非常清晰

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);

這裡的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
public void onError(Throwable e) {
}

@Override
public void onNext(int progress) {
//TODO update progress
}
});

我們以定時2秒查詢一次,直到進度progress=100為止,自動終止輪詢。

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

最適合使用RxJava處理的四種情境

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.