1. 程式人生 > >RxJava結合Retrofit如何避免覆蓋http請求(終端當前http請求)

RxJava結合Retrofit如何避免覆蓋http請求(終端當前http請求)

 unSubscribe("goodsListSubscribe");//取消前一次的http請求,避免頻繁請求導致響應次序及資料混亂
Subscription subscribe =  goodsDAL.queryGoodsList(firstCategoryId, secondCategoryId, key, isBarCode, isPage, null, null, pNo, pSize, orderBy, orderByType, state, null).subscribe(new BaseSubsciber<GoodsListRep>() {
     @Override
public void success(GoodsListRep data) { success.call(data); } @Override public void failure(int code, String msg) { if (failure != null) { failure.call(code, msg); } } }); saveSubscription("goodsListSubscribe",subscribe);

問題:

上例獲取模糊查詢商品列表的例子,由於搜尋框修改關鍵字就需要立即做出響應,

所以會造成頻繁http請求問題(前一次請求還沒響應,就再次請求),覆蓋的請求導致響應次序混亂,顯示結果有時是錯的。

如上程式碼goodsDAL.queryGoodsList封裝了RxJava結合Retrofit網路請求。

解決辦法:

1)在發http請求之前取消訂閱,即unSubscribe("goodsListSubscribe")程式碼的作用。

2)請求發出之後將Subscription儲存起來,以備下次可以取消訂閱。

通過加入上述程式碼,很好的解決問題。

儲存及取消訂閱程式碼如下(具體參考RxJava開發技術):

private Map<String,Subscription> mSubscriptionMap
; public void saveSubscription(String key,Subscription s) { if (mSubscriptionMap == null) { mSubscriptionMap = new HashMap<>(); } mSubscriptionMap.put(key,s); } public void unSubscribe(String key) { if (mSubscriptionMap != null) { Subscription subscription = mSubscriptionMap.get(key); if(subscription != null){ subscription.unsubscribe(); mSubscriptionMap.remove(key); } } }