Volley RequestFuture 超时问题

<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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值