我正在开发一个Android项目,该项目使用Volley进行异步请求和图像缓存。不知怎的,即使我将重试策略设置为0,请求也会两次到达服务器。我尝试覆盖DefaultRetryPolicy对象中的值,但没有成功。以下是一些示例代码:
请求:
@Override
public void gravarVendaMobile(final Usuario usuarioAutenticado, final AsyncCallback<String> callback) {
obterParametrosDeInicializacao().done(new DoneCallback<ParametrosDeInicializacao>() {
@Override
public void onDone(final ParametrosDeInicializacao param) {
requestQueue.add(setDefaultRetryPolicy(new StringRequest(
Method.POST,
urlPara(GRAVAR_VENDA_MOBILE, usuarioAutenticado.getFilial(), usuarioAutenticado.getCodigo()),
listener(callback),
//errorListener(R.string.could_not_load_produtos, callback)
new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(new MessageCodeException(error.networkResponse.statusCode, error));
}
}
) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Encoding", "UTF-8");
headers.put("Accept", "application/json");
headers.put("Content-type", "application/json; charset=UTF-8");
return headers;
}
}));
}
});
}
重试策略:
private Request<?> setDefaultRetryPolicy(Request<?> request) {
request.setRetryPolicy(new DefaultRetryPolicy(30000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
return request;
}
基本上,我想将超时设置为30秒,0次重试。
如果我增加重试次数,它会按预期工作,但如果我将其设置为0,它会发出2个请求。
这里需要帮助。
编辑
我设法解决了我的问题,通过在android中设置keep-alive属性为false。例如:
System.setProperty("http.keepAlive", "false");
我在导入requestqueue并发出请求的类中添加了这行代码。
此外,请检查您的服务器是否具有保持活动的标头。
这篇文章有助于找到解决方案。
protected boolean hasAttemptRemaining() {
return this.mCurrentRetryCount <= this.mMaxNumRetries;
}
据我所见,如果它还没有进行重试,那么将maxNumRetries设置为0仍然会使该返回为true。
我用修复了它
request.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0);
我用它来设置不重复策略:
myRequest.setRetryPolicy(new DefaultRetryPolicy(0,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
只需根据需要将超时设置为20秒或更长时间,然后重试到0
req.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));