当重试策略设置为0时,Android Volley向服务器发出2个请求

时间:2014-10-08 19:32:40

标签: android asynchronous request timeout android-volley

我正在开发一个使用Volley进行异步请求和图像缓存的Android项目。不知何故,即使我将重试策略设置为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");

我在我导入请求队列并发出请求的类中添加了这行代码。

另外,检查服务器是否具有keep-alive标头。

post帮助找到了解决方案。

3 个答案:

答案 0 :(得分:2)

DefaultRetryPolicy.class的hasAttemptRemaining()类如下所示:

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

从我所看到的情况来看,如果没有进行重试,将maxNumRetries设置为0仍然会返回true。

我用

修复了它
request.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0);

答案 1 :(得分:1)

我用它来设置无重复策略:

    myRequest.setRetryPolicy(new DefaultRetryPolicy(0,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

答案 2 :(得分:0)

根据需要将超时设置为20秒或更多,然后重试为0

req.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 0,
  DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));