Learning Android Network Library OkHttp
23 Feb 2017
现在OkHttp已经发展到了3.6版本了,虽然一出来就已经知道,但是从来没有去学习和使用,只是简单的了解过一下,也曾经在这篇blog里面关于Android网络框架有过一些记录。今天就来学习和使用一下这个框架吧,毕竟,从Android4.4开始,底层的网络已经使用OkHttp和OkIO来代替了HttpURLConnection的默认实现,提交的历史在这。
1. What’s OkHttp
官方地址在这,还有GitHub。
虽然4.4以后系统使用OkHttp了,但是低端机还有很多,我们还是需要支持的。当年FaceBook的App以前的优化加载图片就是使用了OkHttp,因为OkHttp 支持在糟糕的网络环境下面更快的重试,并且还能利用SPDY协议进行快速的并发网络请求。
在OkHttp的官网上面介绍得比较清楚,反正就是一堆的高性能啊高效啊的好处,然后google一下OkHttp的教程,基本上都是翻译了一下而已。当然,现在已经很多研究源码的资料了,我现在还没有这个研究源码的兴趣呢。
关于网上的教程,比较好的有IBM的这篇,和稀土挖金的这篇。既然网上都有教程,我也不搬砖,这里只是记录一些自己的理解和别人没有的东西。
2.Volley扩展
关于Volley里面扩展支持使用OkHttp,在这个Gist上有大家的交流。
3.封装使用
对于OkHttp的封装使用,网上的代码一大堆,各有千秋,但是目的都是一个方便好用,当然是对于自己的项目而言。下面是我的封装使用。
首先封装一个参数类:
它是一个抽象类,这样设计的原因是,可以通过参数扩展接口,不然局限性就很大了。
下面是一个具体的实现类:
可以看到,我可以根据不同的业务需求扩展不同的参数需求,而不需要改动封装的代码。
下面看看封装的OkHttp代码:
直接看代码就好了,不要太多的解释,封装也是简单。注意的是,如果请求没有带gzip参数,OkHttp会自动带上的,详细参见:BridgeInterceptor。
4.关于拦截器
其实我对拦截器的概念并不陌生,在大学的时候,那时候我开发web,学习Servlet,就写过Filter过滤器了,里面的原理也比较了解,可以看这篇blog。当我学习Struts2的时候,真正接触拦截器的概念,并且都是链式的连接器,也开发过代码,原理都比较理解,详细看这篇blog。
而其实OkHttp的拦截器也是一样的原理,都是链式执行的。它拦截的是请求的头部和响应的头部,具体,它分了两种拦截器,如下图所示:
应用拦截器对于每个HTTP响应都只会调用一次,可以通过不调用Chain.proceed方法来终止请求,也可以通过多次调用Chain.proceed 方法来进行重试。网络拦截器对于调用执行中的自动重定向和重试所产生的响应也会被调用,而如果响应来自缓存,则不会被调用。
当然,我并没有看过源码,并且http网络这块的底层的东西还是很多不够了解的,这点以后在学习补充吧。