首先,我们来看一下OkHttp的请求流程
- 第一步,构建OkHttp客户端
- 第二步,写request请求地址,其中不止包括url,还要包括请求头,请求参数等等
- 第三步,call,网络请求方式是Okhttp,请求的地址是request,加在一起就是call
- 第四步,把call(请求任务)放到请求队列中进行网络请求
- 第五步,请求成功后返回一个response
OkHttpClient client = new OkHttpClient.Builder()
.readrimeout( tineuut: 5, TimeUnit. SECONDS).build();
Request request =new Request.Builder()
.url("http://www.baidu.com").get().build();
okhttp3.Call call = client.newCall(request);
call.enqueue(new okhttp3.Callback(){
@override
public void onFailure(okhttp3.Call call, IOException e) {e.printStackTrace();
@override
public void onResponse(okhttp3.Call call, okhttp3.Response response) throws IOException{
if (response.isSuccessful()) {
System.out.printIn(" success cli");
}
}
});
在这个过程中,就会出现一系列的问题,如:
- 不同的请求对应的请求地址不同,即request不同,而且配置请求body,请求头,请求参数也很繁琐,每次请求的时候都需要重新一段request代码
- OkHttp只是负责网络请求,返回一个Response,不负责数据的解析,所以用户拿到返回数据后,对responsebody需要自己手动解析,无法进行复用
- 如果用户需要通过上一步的请求结果来进行下一步的请求,会出现回调陷阱
总结一下,OkHttp使用过程中有如下缺陷:
- 用户网络请求的接口配置繁琐
- 数据解析过程需要用户手动拿到responsbody进行解析,不能复用
- 无法适配自动进行线程的切换
- 万一我们的存在嵌套网络请求就会陷入"回调陷阱"
所以需要在okhttp的基础上进行二次封装,由此便引入了Retrofit
Retrofit在OkHttp的基础新增以下功能:
- 利用注解配置网络请求
- 使用Adapter适配不同的call,解决回调陷阱问题,因为Retrofit支持RxJava
- 利用Converter自动完成数据解析
- 利用Executor自动完成线程切换