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

Posted

技术标签:

【中文标题】当重试策略设置为 0 时,Android Volley 向服务器发出 2 个请求【英文标题】:Android Volley makes 2 requests to the server when retry policy is set to 0 【发布时间】:2014-12-03 14:06:52 【问题描述】:

我正在开发一个使用 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 帮助找到了解决方案。

【问题讨论】:

您应该将您的编辑作为单独的答案发布,因为它是您正在寻找的这个问题的解决方案(允许自行回答)。 我遇到了同样的问题。我将超时时间增加到 60 秒,因为即使我有 DefaultRetryPolicy(60000, 0, 0),重试也会继续进行两次。为什么? 这肯定不是您的问题的答案,而是导致问题不会发生的副作用。有两件事不清楚:1)您粘贴的 setDefaultRetryPolicy 在何时何地被调用,因为 Volley 的 ImageRequest 设置了自己的 RetryPolicy 2)这是您使用的 http 堆栈,因为 HURL 使用 okhttp 有一段时间了,它对请求进行静默重试可能会导致真正找到发生这种情况的原因 【参考方案1】:

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

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

据我所知,如果尚未重试,将 maxNumRetries 设置为 0 仍会返回 true。

我用

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

【讨论】:

除了mCurrentRetryCount在调用retry之前增加了hasAttemptRemaining(),所以这里设置重试计数为0正常工作。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

我用它来设置不重复政策:

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

【讨论】:

以上是关于当重试策略设置为 0 时,Android Volley 向服务器发出 2 个请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Azure.Storage.Blobs 程序集对 Azure Blob 存储操作设置重试策略?

PubSub:如何设置没有指数退避的重试策略?

GCP 中的确认截止日期、消息保留时间、死信和重试策略

feginclient和ribbon的重试策略

GCP PubSub:“请求被中止,因为没有可用的实例。” - 不重试失败

基于Kafka1.0消息可靠性设计之消费重试策略