OKhttp是个高效的网络求情框架,支持多种网络请求配置,支持同步和异步两种请求方法(同步请求通过call.execute()直接返回,异步请求是将将请求插入队列中,通过回调反回),支持拦截器处理(拦截器是对request和response的切面处理
),OKhttp支持缓存策略,OKhttp支付重连机制(如果当前来连接失败,会去检查RouteSelector有没有更多的route去连接,还会去恢复当前的连接等)Retrofit和OKhttp属于同一家公司# square
是一款支持Restful API 的网络请求框架,通过注解的方式使得编写客户端代码更加简洁,同时Retrofit可以支持对返回的数据的多种解析方式,比如String,比如你自己的创建的实体,它也可以支持Rxjava。
要说Retrofit的关系,那应该是Retrofit依赖于OKhttp,因为Retrofit的发送请求实际上就是用的OKhttp。
下面看下Retrofit的源码,
Retrofit是基于Java注解的请求框架,里面定义了各种注解,在retrofit2.http下面,比如说GET,POST,HTTP等。其实最主要的是Retrofit使用的动态代理 Proxy.newProxyInstance,动态代理这个鬼在调用声明的请求接口方法的时候起作用,这个时候就会解析我们声明在接口上的注解生成Method,就是下面这个方法
ServiceMethod<Object, Object> serviceMethod = (ServiceMethod<Object, Object>) loadServiceMethod(method);
OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.adapt(okHttpCall);`
这个方法中解析注解,获取参数类型等等一堆,看了好半天才看了个大概。
下面真正发送请求的其实是OKhttpcall,就是我们上面代码中的okHttpCall,之后根据ServicceMethod和参数组合成一个Request对象,发送请求,等请求返回之后,再将response传入serviceMethod中,根据我们设置的ConverterFactory来生成一个Java对象。
其实我们应该知道,使用注解的话其实效率很低的,虽然在Retrofit框架中对serviceMethod进行了缓存,只有第一次请求可能会慢点其他应该还好,那么为什么不考虑跟Butterknife似的,在编译的时候生成代码呢?