我为排球设定了重试政策。尽管未达到超时时间,但查询仍会发送两次。
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));
这有效,并且在超时期限内只发送一个查询
为什么重试政策之间的行为存在差异?
答案 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
将被抛出。