发送网络请求

APP的联网能力现在必不可少, 所以选择一个适合的网络框架至关重要. 我主要以以下几个方面考虑:

  • 使用简单简洁

  • 方便的自定义, 如加请求头

  • 方便的取消请求

  • 能方便的与GSON等序列化库结合

  • 完善的Log信息打印

Retrofit2

最后选择了Retrofit2, 具体介绍可以参考 用 Retrofit 2 简化 HTTP 请求. 基本用法可以参考 官方网站.

这里就不再赘述Retrofit2的优缺点, 主要谈谈引入Retrofit2后需要做的一些准备工作:

  1. 将Retrofit2的API应用至Model层

  2. 与GSON结合

  3. 自定义Log输出

  4. 处理一些通用的异常

  5. 取消请求

  6. 预处理请求结果

1. 将Retrofit2的API应用至Model层

Retrofit的特色是使用注解与接口来描述网络请求, 在多数情况下能很好的与Model层的接口结合起来, 而无需重写实现类.

然后通过api对象去调用getTypes或getTopProducts接口. 通过这种方式我们就能直接将描述请求的接口应当做一个Model来使用. 但是每次使用都去要生成一个Retrofit.Builder, 然后做一些配置, 额外增加了重复代码, 因此我们可以写一个工具类, 来专门生成Retrofit接口实例

在这里我使用了两个类:

  1. RetrofitFactory 持有一个Retrofit单例, 专门用于配置Retrofit, 比如baseUrl, converter, adapter之类.

  2. ApiFactory 单例, 持有一个HashMap对象, 用于缓存Retrofit生成的接口实例, 而无需重复生成.

在使用前还需要调用

2. 与GSON结合

Retrofit2可以很方便的通过Converter与GSON结合, 在RetrofitFactory类中已经做了绑定, 无需再处理.

我们只需要在定义接口的时候给定结果类型, Retrofit内部会调用GSON解析JSON数据, 并转换成相应的实体类.

3. 自定义Log输出

为何要有Log输出? 有了网络请求的Log我们就能很方便的追踪问题, 看是服务器返回的数据有误, 还是我们解析有误. Retrofit2内部使用的是okhttp3, 因此可以考虑使用okhttp的Interceptor来打印Log输出:

然后在RetrofitFactory中加入:

以下是Log格式:

接下来的几部分都建议在有一定RxJava基础的情况下阅读. 参考RxJava.

Last updated

Was this helpful?