Volley

作者: flaming | 来源:发表于2016-04-05 15:43 被阅读56次
Volley原理 Request请求处理流程

Request处理流程

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

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

mCacheQueue :PriorityBlockingQueue<Request<?>> 

mNetworkQueue:PriorityBlockingQueue<Request<?>>

mWaitingRequests: Map<String,Queue<Request<?>>>

如何判断缓存是否过期

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

何时解析返回头?

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

相关文章

网友评论

      本文标题:Volley

      本文链接:https://www.haomeiwen.com/subject/jvdlkttx.html