1. 程式人生 > >RxJava整合Retrofit遇到的問題總結

RxJava整合Retrofit遇到的問題總結

exception 實現 請求 serve 執行過程 color 相對 row ima

一:初上手(填坑)

  Observable將事件序列執行完畢後,會回調Observe的onNext()方法和onCompleted()方法,當出現異常/錯誤時會調用onError()方法。

由此,我們推斷,問題出現的地方應該是在Observable的執行過程。

  先闡述一下筆者的需求,使用retrofit和rxjava進行簡單的網絡請求(請求得到的數據自動裝配為實體類),後端給的返回格式是標準的Result格式(即status,message,data),前兩者相對固定,而data域可能是User對象,Paper對象,也可能是Map/List,而我們想要得到的就是這個data中的數據,那麽我們勢必需要進行數據的剝離。恰好,RxJava的map(變換)可以實現此需求。

  下面,上圖:

  1.Paper實體類

技術分享圖片

  2.Result結果集實體類

技術分享圖片

  3.定義Retrofit的請求接口

技術分享圖片

  4.創建Retrofit實例

技術分享圖片

  5.由於請求接口定義的返回類型為Observable<...>類型,所以可直接在其上進行rx的鏈式操作

技術分享圖片

  6.圖中的map()方法中的參數是一個自定義的接口,用於 事件變換

技術分享圖片

  7. 圖5中的onNext方法中使用自定義接口(如下圖),進行數據轉發

技術分享圖片

技術分享圖片

  8.測試

技術分享圖片

  9. 一萬個草尼瑪,什麽鬼。再往下看日誌,發現

技術分享圖片

  技術分享圖片

臥槽,尼瑪. 無效的時間指示器(原諒我蹩腳的英文)。且上圖的數字,便是json中的日期

  10. 由此,筆者便猜測是Gson裝配過程中出現的問題,然後通過一番學習,發現Gson默認解析時間時會出現問題,原因未知,有知道的同學可以在評論區留言,互相學習了啦。

  解決方案:

     GsonBuilder builder = new GsonBuilder();

        // Register an adapter to manage the date types as long values
        builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
            
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { return new Date(json.getAsJsonPrimitive().getAsLong()); } }); Gson gson = builder.create();

  然後在下圖位置傳入gson實例

技術分享圖片

  11. 再次測試

技術分享圖片

天地良心,終於可以了。下一節,會寫一些關於對RxJava和Retrofit的封裝。

RxJava整合Retrofit遇到的問題總結