Android Volley 源码解析(一),网络请求的执行流程

本文详细解析了Volley库的网络请求执行流程,包括CacheDispatcher和NetworkDispatcher的工作原理。当创建RequestQueue后,会启动多个线程,其中CacheDispatcher负责处理缓存,NetworkDispatcher负责网络请求。Request根据是否需要缓存进入相应队列,CacheDispatcher检查缓存并处理,NetworkDispatcher执行网络请求。最后,解析响应并分发到主线程进行回调。
摘要由CSDN通过智能技术生成

for (int i = 0; i < mDispatchers.length; i++) {

NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork,

mCache, mDelivery);

mDispatchers[i] = networkDispatcher;

networkDispatcher.start();

}

}

public void stop() {

if (mCacheDispatcher != null) {

mCacheDispatcher.quit();

}

for (final NetworkDispatcher mDispatcher : mDispatchers) {

if (mDispatcher != null) {

mDispatcher.quit();

}

}

}

先调用 stop() 方法将当前正在进行 Dispatcher 都停掉,然后创建了一个 CacheDispatcher 实例,并调用了它的 start() 方法,接着在一个循环里去创建 NetworkDispatcher 的实例,分别调用它们的 start() 方法,这里的 CacheDispatcher 和 NetworkDispatcher 都是继承自 Thread 的,默认情况下 for 循环会执行四次,也就是说当调用了 Volley.newRequestQueue(context) 之后,就会有五个线程在后台运行,等待网络请求的到来,其中 CacheDispatcher 是缓存线程,NetworkDispatcher 是网络请求线程。

得到 RequestQueue 之后,构建相应的 Request,然后调用 add() 方法将其加入到请求队列中

public Request add(Request request) {

// 将 Request 标记为属于此队列,并将其放入 mCurrentRequests 中

request.setRequestQueue(this);

synchronized (mCurrentRequests) {

mCurrentRequests.add(request);

}

// 让 Request 按照他们被添加的顺序执行

request.setSequence(getSequenceNumber());

request.addMarker(“add-to-queue”);

//如果请求不需要被缓存,就跳过缓存,直接进行网络请求

if (!request.shouldCache()) {

mNetworkQueue.add(request);

return request;

}

mCacheQueue.add(request);

return request;

}

可以看到,传入 Request 之后,会先判断该 Request 是否需要进行缓存,如果不需要就直接将其加入到网络请求队列,需要缓存则加入缓存队列。默认情况下,每条请求都是应该缓存的,当然我们也可以调用 Request 的 setShouldCache() 方法来进行设置。

Request 被添加到缓存队列中后,在后台等待的缓存线程就要开始运行起来了,我们看下 CacheDispatcher 的 run() 方法究竟是怎么实现的。

@Override

public void run() {

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

// 初始化 Cache

mCache.initialize();

while (true) {

try {

processRequest();

} catch (Interr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值