Volley源码分析

使用请看http://blog.csdn.net/wfeii/article/details/73141230

介绍

  • 什么是Volley
    Volley是一个HTTP的开源库,目的是让App的网络请求更容易,更迅速。

  • 能干什么
    Volley一般用于数据量小,而频繁的数据请求。

  • 不能干什么
    Volley不适合大型的下载或者流操作,在解析的时候会把网络请求的响应保存到内存中,会导致内存使用过大。

整体结构

结构图

  • 对外接口Volley,使用Facade封装内部实现,只提供便捷的方法

  • Request,封装请求数据和请求响应的解析

  • Cache,缓存请求返回的数据

  • Network,网络请求的分发与真正的网络请求

  • Response,返回的请求数据

  • Error,对于请求的异常,Volley封装成自定义的Error,减少错误逻辑,保证正常干净。

  • 网络底层API,现在基本使用HttpURlConnection来请求

  • 对于Cache的缓存,使用了文件保存

实际编写代码时候对外接口采用Facade模式,一方面可以隐藏内部接口的复杂性,另一方面也保证了对外接口的易用性。

面向接口

Volley类图

Volley整体类图

Request

Volley_Request

Volley_request

每一次的网络请求都会创建一个Request对象。

  • Request封装了网络请求的数据,而且封装了网络响应的解析接口,网络响应的分发接口

    • parseNetworkResponse(NetworkResponse) : Response
    • parseNetworkError(VolleyError) : VolleyError
    • deliverResponse(T response) : void
    • deliverError(VolleyError) : void
  • Request的网络响应的数据采用泛型,而子类来具体化,比如StringRequest是把网络响应的数据封装成String,JsonObjectRequest返回JSONObject对象。

实际代码中我么可以学习一下泛型的方式,提高代码的设计。

Cache

Volley_Cache

Volley_cache

Cache缓存网络的响应数据。

  • CacheDispathcer用与获取缓存数据和Request的分发,缓存能获取直接返回,否则从网络中获取。
  • Cache接口封装了一般性的缓存的方法,当我们设置了不使用缓存机制的时候,将使用NoCache。
  • Entry缓存的bean类。

实际代码中我们可以使用Cache接口的方式,对于没有缓存机制的时候可以使用NoCache,这样可以避免标识的变量到处传递。还有一下null的判断,类似的也可以使用NullObject来代码判断为null。

NetWork

Volley_Network

Volley_network

Network负责真正的网络请求

  • NetworkDispatcher用于分发Request,如果有缓存,让CacheDispather处理。
  • ResponseDelivery主要分发支付结果,比如子线程到主线程
  • Network接口与HttpStack使用策略模式进行组织,对于Volley底层使用Okhttp,可以实现HttpStack来实现。
if (stack == null) {
    if (Build.VERSION.SDK_INT >= 9) {
        stack = new HurlStack();
    } else {
        // Prior to Gingerbread, HttpUrlConnection was unreliable.
        // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
        stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
    }
}

实际代码中,策略设计模式来提高代码的扩展性。

Response

Volley_Response

Volley_response

ResponseDelivery分发支付结果,而ExecutorDelivery主要用于把网络响应的数据从工作线程传递到UI线程中。ExecutorDelivery其中依赖ResponseDeliveryRunnable,主要是主线程的Handler来post一个Runnable。Response是封装的网络响应。

这段代码可以在实际中抽出来用于线程向主线的传递数据。
##思考

  • StringRequest支持表单的方式请求,而如果我以其他的方式请求网络,就必须继承StringRequest,实现自己的方式,是否我们可以把请求的body抽象出来创建接口RequestBody,实现不同请求方式,只需要替换相关的RequestBody,提高扩展性。

单元测试

  • 怎么样才具有可测性?
  • 测试哪些内容?

面向接口

要想代码有可测性,需要面向接口编程,依赖关系尽量依赖接口,这样依赖的接口就可以mock,使得测试逻辑可以书写。

Volley_ResponseDelivery_test

以Volley的ResponseDeliveryTest为例,实际测试ExecutorDelivery的逻辑。

  • ExecutorDelivery主要依赖Request,Response,需要先Mock

  • ExecutorDelivery的测试小技巧,引入Executor,便于测试,而且提供了便于测试的构造函数

    Notice:

    依赖注入,接口中创建了某个对象,尽量另行创建一个方法去创建对象。

逻辑问题

  • 测试内容以逻辑判断为主,对于赋值,取值的方法不需要测试。
  • 测试认为是可能出错的代码,不是所有的代码都需要测试,这样能够达到测试的书写的回报更高。

开源库源码分析

短时间,高质量的分析开源库,并能为我所用呢?思考题

编程技巧

  • Exception统一处理,这样代码正确的流程就更清晰,比如Volley中VolleyError采用的是对于异常封装自己的异常然后再做处理。
  • 网路请求封装使用File缓存,慎用内存缓存。
  • Facade模式封装子系统,对外只提供必要的接口。
  • 模块化,标准化,我们写代码中尽量通用模块不依赖具体的逻辑,这样下次做项目有类似的需求我们就可以直接拿来使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值