Volley

Volley_第1张图片
Volley原理
Volley_第2张图片
Request请求处理流程


Request处理流程

RequestQueue类中有三个主要的队列。调用RequestQueue.add(request)加入的请求会先加入mCacheQueue(优先级阻塞队列)由CacheDispatcher( 循环读取队列中的请求,当没有请求处理时线程阻塞)线程处理。如果该请求之前已经被缓存,读取缓存返回给主线程结果。否则将请求加入mNetworkQueue由NetworkDispatcher线程处理。由于处理网络请求比较耗时,NetworkDispatcher线程默认开启四个。每个线程都循环从mNetworkQueue读取请求,执行HTTP请求并解析服务器返回结果,将结果存入缓存,同时向通过handler会掉到主线程,向用户返回结果。

如果该请求不是第一次处理,在进入mCacheQueue之前,可能回被加入mWaitingRequests(如果有相同url的请求正在处理)。作用是避免重复的请求多次执行,提高请求速度。当请求处理完之后,会检查mWaitingRequests是否有等待的请求,并全部加入缓存队列。

mCacheQueue :PriorityBlockingQueue

mNetworkQueue:PriorityBlockingQueue>

mWaitingRequests: Map>>

如何判断缓存是否过期

Expires首部和Cache-Control:max-age首部都是来告诉缓存文档有没有过期。Volley提供的解析类HttpHeaderParser在解析HTTP返回结果时,会从返回头中获取Expires和Cache-Control:max-age相关信息并存储在缓存数据中。如果没有过期还要判断是否需要刷新。一般如果数据没有过期是不需要刷新的。但是如果返回头中包含stale-while-revalidate会将数据提交给用户后请求刷新数据。

何时解析返回头?

在实现Request类的抽象方法parseNetworkResponse时,用户必须调用HttpHeaderParser.parseCacheHeaders解析返回头,否则无法判断缓存是否过期

你可能感兴趣的:(Volley)