你的位置:首页 > 软件开发 > 操作系统 > Android网络编程随想录(四)

Android网络编程随想录(四)

发布时间:2015-09-29 20:00:21
前面三篇文章从最基础的TCP,HTTP协议理论开始,然后介绍了在Android的开发中所使用的HttpClient和HttpUrlConnection这两种Http客户端。在本文中,我们一起来学习一下在Android开发中经常使用的volley框架。首先,我们会从架构的角度了解一 ...

Android网络编程随想录(四)

       前面三篇文章从最基础的TCP,HTTP协议理论开始,然后介绍了在Android的开发中所使用的HttpClient和HttpUrlConnection这两种Http客户端。在本文中,我们一起来学习一下在Android开发中经常使用的volley框架。首先,我们会从架构的角度了解一下整个框架的结构,然后从源码的角度理解框架实现细节。

       volley是Google在13年发布的一款Android异步网络请求框架。volley有着鲜明的特点:适用于小数据量且频繁的网络请求。这个特点特别适合于Android应用程序的网络操作。另外,我们从接下来将要介绍的架构中可以发现,volley采用了大量面向接口的设计,保证了整个框架的开放性和灵活性,可以根据不同的情况需求进行定制。同时,volley也提供了简单的图片加载工具。

       在我们研究volley框架的结构之前,我们不妨自己先来思考一下如何实现一款网络操作的框架。首先,我们根据实际需求设计网络操作请求(无非就是URL及其参数),然后使用多线程并发来执行和处理网络操作请求任务。从服务器中取到数据后,将数据放在内存的cache中以便应用程序使用。

       其实volley框架也是如此设计的,如下图所示:

Android网络编程随想录(四)

       从图中我们可以看到,整个框架的结构分为4个部分:

1、volley使用一个请求队列来管理各种网络请求Request。Request本身是一个描述请求的抽象类,我们可以根据具体需求情况实现该抽象类。volley也提供了一些Request子类,例如StringRequest,JsonRequest,ImageRequest等等。

2、在请求队列RequestQueue中,有两种个轮询分发线程负责对请求任务进行分发调度。第一种是CacheDispatcher,负责调度数据保存在cache中的请求任务;第二种是NetworkDispatcher,负责调度数据在远端服务器上的请求任务。另外,RequestQueue中还有一个叫作ResponseDelivery的接口,用于进行结果分发。请求队列中的网络请求会首先被放入Cache任务队列中,被CacheDispatcher线程调度。CacheDispatcher会试图从cache中取出该任务所请求的数据,如果命中则交给ResponseDelivery解析该数据并返回给应用程序;如果未命中,或者缓存失效等情况下,则将该请求任务加入到网络任务的队列中,供NetworkDispatcher进程调度。NetworkDispatcher请求结束则将结果交给ResponseDelivery作后续的处理。

3、从上面的分析中我们可以看出,我们所请求的数据主要存在两个个地方:Cache和网络。volley中分别使用Cache和HttpStack这两个接口来描述它们以及所需执行的操作。其中,HttpStack负责处理http网络请求,volley中有两种方式实现了HttpStack接口:基于 HttpURLConnection 的HurlStack 和 基于HttpClient 的HttpClientStack 。而Cache既可是基于SD卡,又可以基于内存。

4、通过上面所述的两个接口可以获取并操作我们请求的数据,这些数据主要分布在网络服务器和本地内存或SD卡中。

 

       volley维护了一个请求队列来管理应用程序的网络请求,并采用了单例模式来保证一个应用程序只含有一个请求队列。通常情况下,我们会继承Application类,并通过newRequestQueue方法来创建一个请求队列。从源码中我们可以看出,在Android2.3以上使用了基于HttpUrlConnection的HurlStack处理网络请求,而2.3以下使用了基于httpclient的HttpClientStack来处理网络请求。这里的原因在上一篇文章中我们提到过,这里不再赘述。下面我们顺着请求的提交—>处理—>完成 的这条线路来研究一下框架的内部细节。

       针对不同的网络请求,我们可以实现Request这个抽象类。该抽象类描述了请求的url,方式,head,body以及优先级等等信息。然而volley已经为我们实现了大部分的子类来满足各种需求。在Request的子类中,我们需要重写两个方法:

protected Response<T> parseNetworkResponse(NetworkResponse response) :用于将网络返回的字节流解析为合适的数据类型。protected void deliverResponse(T response) :将解析好的数据传递给它的监听回调。

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:Android网络编程随想录(四)

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录