RxJava結合Retrofit如何避免覆蓋http請求(終端當前http請求)
阿新 • • 發佈:2019-01-25
unSubscribe("goodsListSubscribe");//取消前一次的http請求,避免頻繁請求導致響應次序及資料混亂 Subscription subscribe = goodsDAL.queryGoodsList(firstCategoryId, secondCategoryId, key, isBarCode, isPage, null, null, pNo, pSize, orderBy, orderByType, state, null).subscribe(new BaseSubsciber<GoodsListRep>() { @Overridepublic 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); } } }