毫无疑问,OkHttp的横空出世,让其他网络请求框架都黯然失色。它是一个高效的HTTP客户端,作为目前Android开发中最为广泛使用的网络框架。不得不说OkHttp是真的强大真的香。
但在实际的项目开发过程中,这个框架也给开发者们留下了不少问题:
- 无法适配自动进行线程的切换,消息回来需要切到主线程,主线程要自己去写。
- 调用比较复杂,需要自己进行封装。
- 用户网络请求的接口配置繁琐,尤其是需要配置请求body,请求头,参数的时候;
- 数据解析过程需要用户手动拿到responsbody进行解析,不能复用;
- 缓存失效:网络请求时一般都会获取手机的一些硬件或网络信息,比如使用的网络环境。同时为了信息传输的安全性,可能还会对请求进行加密。在这些情况下OkHttp的缓存系统就会失效了,导致用户在无网络情况下不能访问缓存。
但Retrofit的出现可谓是雪中送炭,通过在OkHttp的基础上进行封装,切实解决了这些问题,让我们在网络框架开发上更加的游刃有余。
Retrofit对OkHttp做了什么
Retrofit是一个非常强大的封装框架,可以配置不同HTTP client来实现网络请求,如okhttp、httpclient等;可以定制请求方法的参数注解;可以同步或异步RxJava;轻松实现超级解耦;配置不同的反序列工具来解析数据,而且设计模式颇多,使用非常方便灵活:
stay大神整理的Retrofit源码流程图
网络请求的工作本质上仍旧是 OkHttp 完成,Retrofit 负责网络请求接口的封装,并没有改变网络请求的本质,因为OkHttp已经足够强大。Retrofit的封装则是让我们更加游刃有余,里面涉及到非常丰富的设计模式,通过注解直接配置请求,可以使用不同的http客户端,虽然默认用http,但是可以通过不同的Json Converter 来序列化数据,同时对RxJava提供支持。
Retrofit + OkHttp + RxJava是目前比较潮的一套框架。但这套框架其实是有一定门槛的,尤其是Retrofit的核心原理掌握。和OkHttp一样,Retrofit现在也是大厂面试的必会问题之一:
诸多面试官也会在这部分打出连环重拳:
- Retrofit 是如何工作的
- 用过哪些网络加载库?Retrofit核心实现原理?
- 如果让你实现Retrofit的某些核心功能,你会考虑怎么去实现?
- Retrofit的注解是怎么解析的 ?
- Retrofit网络请求层用的什么?
- Retrofit中使用了哪些设计模式?
- Retrofit在OkHttp上做了哪些封装?动态代理和静态代理的区别,是怎么实现的?
- Android开发Repository层如何拿到retrofit返回的数据?
- Retrofit也用apt去做是否可行?为什么不用apt而用动态代理?