在达到超时时间之前,Volley RetryPolicy查询两次

时间:2016-10-21 05:56:49

标签: android android-volley

我为排球设定了重试政策。尽管未达到超时时间,但查询仍会发送两次。

 StringRequest stringRequest = new StringRequest(method, currentURL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    S.L("response: " + currentURL);
                    listener.onRequestExecuted("response", response, downloadId);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("CCC", "Error " + error.toString());                                             
                }
            })

这是之前的重试政策

stringRequest.setRetryPolicy(new RetryPolicy() {
        @Override
        public int getCurrentTimeout() {
            return 8000;
        }

        @Override
        public int getCurrentRetryCount() {
            return 1;
        }

        @Override
        public void retry(VolleyError error) throws VolleyError {
            S.L("Retry error: " + error);
        }
    });

在SO上还有另一个question与此相关。尽管没有达到超时时间,但当凌空检测到连接缓慢时,它似乎会这样做。这里的解决方案是使用不同的重试策略:

stringRequest.setRetryPolicy(new DefaultRetryPolicy(8000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

这有效,并且在超时期限内只发送一个查询

为什么重试政策之间的行为存在差异?

1 个答案:

答案 0 :(得分:0)

  

为什么重试政策之间的行为存在差异?

由于retry()实现不同。

来自DefaultRetryPolicy的源代码:

@Override
public void retry(VolleyError error) throws VolleyError {
    mCurrentRetryCount++;
    mCurrentTimeoutMs += (mCurrentTimeoutMs * mBackoffMultiplier);
    if (!hasAttemptRemaining()) {
        throw error;
    }
}

protected boolean hasAttemptRemaining() {
    return mCurrentRetryCount <= mMaxNumRetries;
}

通过将DefaultRetryPolicy.DEFAULT_MAX_RETRIES传递给构造函数,您可以有效地将mMaxNumRetries设置为1

在第二次重试hasAttemptRemaining()将返回false并且VolleyError将被抛出。