天天看点

Android开源框架分析0——Volley框架详解

这两天花时间看了下Volley的源码,参考了几篇博文 Android Volley完全解析(四),带你从源码的角度理解Volley,Volley 源码解析,谷歌Volley网络框架讲解——网络枢纽等,有一点自己小小的心得体会,在此写出来和大家分析。

1.基本网络请求操作封装

既然是网络框架,最重要的当是网络请求相关操作的处理,在没有网络请求框架的时候,我们是利用最基本的HttpClient和HttpURLConnection进行网络请求的。

先看一张Volley主要网络请求类——HttpClientStack, HurlStack ,BasicNetwork,Volley等的UML结构图(取自谷歌Volley网络框架讲解——网络枢纽):

Android开源框架分析0——Volley框架详解

Volley将HttpClient和HttpURLConnection这两种方式进行了封装,避免每次网络请求进行繁琐的设置。首先是分别将HttpClient,HttpURLConnection封装到HttpClientStack和HurlStack两个类中,两个类的核心方法是

相比于直接调用HttpClient,HttpURLConnection,已经方便多了,但是HttpClientStack和HttpURLConnection仍是分开的两种请求方式,而且又有共同的方法,可以进一步的封装。Goolge提供了BasicNetwork类,把这两个类再次封装到一起,对外统一提供public NetworkResponse performRequest(Request<?> request) 方法,并且使用byte[] 的回收池,用于 byte[] 的回收再利用,减少了内存的分配和回收。至此单纯的网络请求封装已经差不多了,在对外调用的Volley类中,依据Android API的版本生成****Stack的对象(低版本的Android API HttpURLConnection存在一个bug,详见官方说明),再利用其构造BasicNetwork的对象,

if (stack == null) {
            if (Build.VERSION.SDK_INT >= ) {
                stack = new HurlStack();
            } else {
                stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
            }
        }

        Network network = new BasicNetwork(stack);
           

一个处理网络请求的对象就产生好了。

请求队列分发、缓存、传送

一个好的网络请求框架的功能不只满足于封装基本网络请求操作,还包括管理N多的网络请求,请求的缓存,结果的传送等。

这是一张Volley的流程示意图:

Android开源框架分析0——Volley框架详解

每产生一个网络请求,加入到请求集合mCurrentRequests中,首先判断是否缓存,否则放到网络队列mNetworkQueue,是则放入到缓存队列mCacheQueue。Android的设计中UI主线程不宜进行耗时操作,而读写缓存、网络请求都是典型的耗时操作,如果这时候在主线程执行这些操作,无疑容易产生ANR,影响用户体验。Volley默认产生了五个线程供缓存和网络操作,其中一个用于缓存,四个用于网络。将mCacheQueue传给缓存线程,根据请求是否取消、是否读到缓存及缓存是否过期,决定是否要将当前请求提交到网络线程从网络加载数据。如果从缓存中都到有效数据,直接将response传动到主线程。

网络请求线程中根据request,调用BasicNetwork进行网络请求,并将数据传动到UI线程。

这样分发,缓存,传送的流程就差不多了。

细节

除了框架流程,网络库要处理的细节也很复杂,例如请求头的解析,网络请求Https,Cookie,重试等。需要我们深入到代码细细体会。我也打算先照着敲一遍代码,加深印象,不管从整体设计还是细节实现,Volley都值得我学习,哥就是想把代码写成这样子的人,啊哈哈!

很惭愧,做了一点微小的贡献!

继续阅读