<pre name="code" class="html">
<pre name="code" class="html">
Volley 一个好用强大的网络请求库
Volley 的主要特点
(1). 扩展性强。Volley 中大多是基于接口的设计,可配置性强。
(2). 一定程度符合 Http 规范,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的处理,请求头的处理,缓存机制的支持等。并支持重试及优先级定义。
(3). 默认 Android2.3 及以上基于 HttpURLConnection,2.3 以下基于 HttpClient 实现,这两者的区别及优劣在4.2.1 Volley中具体介绍。
(4). 提供简便的图片加载工具。
问题点前提&提出: (1)项目需求中有很多并发请求,但是数据量不是很大。 (2)Volley RequestQueue 默认调度现成为4个 /** Number of network request dispatcher threads to start. */ private static final int DEFAULT_NETWORK_THREAD_POOL_SIZE = 4; (3)项目需要同步的网络请求,使用了Volley提供的RequestFuture。 (4)使用过程中发现了RequestFuture中goGet(**)中抛出的Timeout异常. (5)追踪log发现Volley queue中并发的请求多,出现了排队现象,实际该Request没有开始发起网络请。
问题:
RequestFuture 的 doGet方法只是单纯的wait,实际并不是等Request真正开始请求时才开始计timeout时间,这样就会出现,如果volley并发多时Request没被真正执行,但是Future已经超时了。以下是代码:
@Override public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return doGet(TimeUnit.MILLISECONDS.convert(timeout, unit)); } private synchronized T doGet(Long timeoutMs) throws InterruptedException, ExecutionException, TimeoutException { if (mException != null) { throw new ExecutionException(mException); } if (mResultReceived) { return mResult; } if (timeoutMs == null) { wait(0); } else if (timeoutMs > 0) { wait(timeoutMs); } if (mException != null) { throw new ExecutionException(mException); } if (!mResultReceived) { throw new TimeoutException(); } return mResult; }