zoukankan      html  css  js  c++  java
  • 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的封装。

  • 相关阅读:
    深入A标签点击触发事件而不跳转的详解
    js、css、html判断浏览器的各种版本
    深入理解this对象
    背景透明文字不透明的最佳方法兼容IE(以背景黑色透明度0.5为例)
    解决ie6支持最大高度最小高度的方法
    js点击更多显示更多内容效果
    artdialog关闭弹出窗口
    (巧用)事件代理
    CSS3盒模型display:-webkit-box;的使用
    文件上传input type="file"样式美化
  • 原文地址:https://www.cnblogs.com/xykjlcx/p/8025033.html
Copyright © 2011-2022 走看看