RxJava整合Retrofit遇到的問題總結
一:初上手(填坑)
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遇到的問題總結