Volley学习记录
当你替换一个框架、使用一个框架的理由是什么呢?做了哪些准备和调研
性能上的优化
使用场景:
用retrofit来提高性能
Retrofit的高度封装和注解可以大大简化代码
AsyncTasks在多任务的时候表现乏力,速度慢。
包的体积
优点
- 可直接在主线程调用服务端并处理返回结果。
- 可以取消请求,容易扩展,面向接口编程。
- 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
- 支持请求优先级
- 支持取消请求
- 可以根据手机CPU调整调度器的个数
缺点
- volley不适合上传下载大量文件,volley的request和response都是把数据放到byte数组里,不支持输入输出流。
- 特别适合数据量小,通信频繁的网络操作。
- 只支持https请求
- 不支持401错误码。只考虑了statusCode(statusCode < 200 || statusCode > 299的情况。
功能点:
-
取消请求机制
-
取消队列机制
-
缓存机制
-
异常处理机制
-
网络请求数据处理流程
-
异常处理流程
-
Request类:
1、分装请求参数
2、封装结果回调监听(Listener)
3、不同的Request子类类型重写解析函数,解析请求后的数据,
4、把解析后的数据分发给Listener。
5、优先级通过内部枚举Priority来定义
6、是否缓存开关
7、Request中的请求优先级机制:
在Request对象加入到请求列队的时候会给Request对象设置一个squence序列号,通过AtomicInteger.incrementAndGet()来获取,然后加入到PriorityBlockingQueue,在加入的时候PriorityBlockingQueue会对实现了Compare接口的对象排序,Request实现了Compare接口,在Request的compareTo方法中的比较方式有两种,首先根据对Request设置的枚举Priority来判断,如果相等的话,就根据squence序列号来定义优先级规则
8、重试策略RetryPolicy -
NetworkDispathcer
顾名思义“网络调度器”,Thread的子类,在RequestQueue创建的时候被创建,在RequestQueue的一个线程数组中存起来,然后全部初始化运行,在每个调度去的run()里面死循环从请求队列里面去取,如果队列没有数据就阻塞。
干的事情:
1、死循环从请求队列取东西。
2、在请求之前request.isCanceled()检查request是否被取消。
3、可以调用quit()方法退出调度器,中断线程。
4、mNetwork.performRequest执行“真正的请求”返回NetworkResponse
5、把NetworkResponse丢给Request去解析,这里给Request解析的好处是根据不同的Requsest返回不同类型的数据
6、是否需要缓存
7、mDelivery进行回调分发 -
Respose
存储返回的结果、以及Request解析的数据类型。 -
NetworkResponse
用来包装网络请求后的数据
public final int statusCode;//用来保存返回码
public final byte[] data;//保存服务器返回的二进制数据,这也是为什么不能下载大数据的原因,把数据都缓存在了数组。
public final Map<String, String> header;//存放返回相应头
public final boolean notModified;//是否被修改
public final long networkTimeMs;//响应时间 -
Cache、Cache.Entry
用来包装缓存的数据 -
HurlStack实行真正的请求,volley要实行高扩展很多都是对这个类进行的。
1、UrlRewriter对url进行进一步的改造,这个类可以通过HurlStack的构造传递进来,在volley初始化的时候进行扩展。还可以定义SSLSocketFactory对https进行支持。
2、openConnection()方法放回HttpURLConnection对象,是一个工厂方法,可以重写这个方法对Okhttp进行扩展。 -
HttpResponse、HttpResponse.HttpEntity
这里用了apache的包,HttpResponse分装了请求的状态码,把connection的输入流inputStream、content-length、encoding封装起来返回交给给上一层,这里注意把inputStream抽取出来交给具体去处理非常灵活。