當前位置:編程學習大全網 - 源碼下載 - Retrofit2.0+RxJava網絡請求異常統壹處理

Retrofit2.0+RxJava網絡請求異常統壹處理

本文內容是基於RxJava 2.0及Retrofit 2.1分析的。參考了 Rxjava +Retrofit 妳需要掌握的幾個技巧,Retrofit緩存,統壹對有無網絡處理, 異常處理,返回結果問題

下面列出具體添加的依賴。

以下這些錯誤,都是在網絡請求中經常見的。我們可以通過Toast彈出消息通知用戶具體的異常以及加載對應的UI界面。除此之外,通過具體的異常信息,方便我們及時的排查項目中的BUG。

那麽問題就來了,我們如何判斷異常的類型?

這就要從服務器返回的數據格式說起了。

我們壹般請求的返回都是像下面這樣

服務器端返回數據約定俗稱就是大概以上的格式。可能具體的code碼表示的含義不壹樣,這個可以與服務器端人員交流,靈活變化。

關於Retrofit的基本配置就不再講述了,這裏具體講解如何對服務器返回數據封裝以及使用RxJava對錯誤信息處理。

封裝返回數據

對於上述的服務器返回數據我們要對code做出壹些判斷,code不為200(假設200表示請求網絡成功)就拋出異常。所以我們新建壹個BaseResponse類,對應上面的數據結構。

這算是所有實體的壹個基類,data可以為任何數據類型。

然後要對返回結果進行預處理,新建壹個ExceptionHandle。預處理無非就是當根據返回數據BaseResponse的isOk()方法判斷為是否為true,若為true則正常處理,否則拋出異常讓ExceptionHandle進壹步處理,判斷異常為何種異常。我們先跳過前面的邏輯,先了解如何判斷是何種異常?

判斷異常類型

詳細可看源碼,下面會貼出地址。

通過ExceptionHandle.handleException(Throwable e) 即可返回壹個異常,並攜帶具體異常類型信息。

現在我們已經知道了如何判斷是否產生以上以及如何判斷異常類型。接下來需要解決地就是如何把異常傳遞給Observer的onError(Throwable e)去處理異常。

在進行異常傳遞的過程中,第壹步我們先要判斷服務器返回的數據是否是異常,如果不是異常則返回data數據,如果是異常則拋出異常。這個時候就包含了壹個數據轉換的過程即把BaseResponse對象轉換成data類型的對象,所以需要map()操作符。

其中HandleFuc實現了 Function<BaseResponse<T>, T> 接口

如果不出現異常則不會走第二步。如果出現異常,則需要進行第二步,即對異常進行判斷,然後將ExceptionHandle.handleException(Throwable e) 返回的異常傳入onError()中處理。

重點來了:當產生異常時,應該終止對onNext()方法的調用並調用onError()方法。如果不繼續處理,僅通過以上步驟,雖然會調用onError()方法,但是沒有對異常進行判斷,並且沒有取消onNext()方法。那麽有沒有壹個好的方法,可以即取消onNext()方法,又能在其中實現異常判斷的執行,並且會調用onError()方法?

如此強大的RxJava自然有這樣的方法了, onErrorResumeNext() 就能實現這個要求。對於 onErrorResumeNext() ,可以簡單理解為:當發生錯誤的時候,由另外壹個Observable來代替當前的Observable並繼續發射數據。

onErrorResumeNext() 中傳入的參數可以是壹個Function接口。這樣,我們可以在Function中生成壹個Observable,該Observable執行異常判斷的邏輯,並調用onError()方法。

具體實現如下:

至此,我們便實現了異常判斷與傳遞的邏輯。這樣我們就可以在onError()方法中提取具體的異常狀態信息,進行相應的處理。

大概流程是:map()進行數據類型轉換,並檢測異常。如果正常,返回data類型的數據。如果不正常,onErrorResumeNext()判斷異常類型並傳遞異常

上述情況關閉了網絡。當發起網絡請求,沒有網絡則拋出異常,然後檢測出具體異常,Toast提示異常類型,用戶便知道是什麽地方出錯了。

demo參考地址: /maiduoduo/RetrofitRxJavaException

  • 上一篇:josephu 用java 來實現 誰有代碼的,加分
  • 下一篇:易語言寫個 瀏覽器
  • copyright 2024編程學習大全網