请求重试后不会调用Android排球响应侦听器

时间:2017-01-26 10:18:11

标签: android android-volley

Volley
        .newRequestQueue(context)
        .add(new JsonObjectRequest(
                Request.Method.POST,
                BuildConfig.API_URL + "/user",
                userJson,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        doSthOnRequestSuccess();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        doSthOnRequestFail();
                    }
                }));

当请求超时时,运行ErrorListener,然后Volley自动重试请求,这次成功。但是后来成功响应监听器没有运行。

例如,当用户单击某个按钮时,我发出请求,请求失败,因此我在屏幕上显示操作失败的错误消息。屏幕现在处于错误状态,但是Volley在后台重试请求,它成功,但不调用成功侦听器代码。这会导致屏幕保持错误状态,或者用户再次单击该按钮并发出重复请求。

我修改了voli调用能够处理重复请求的api,但有没有办法在android端解决这个问题?

2 个答案:

答案 0 :(得分:1)

我认为如果凌空在最后一次尝试后给你回调。这意味着如果你设置的最大重试次数为3,api失败为2而不是3,那么你将获得onResponse()回调。

答案 1 :(得分:1)

Volley为每个请求返回错误或成功。这意味着当调用onErrorResponse时,您不能指望可以调用onResponse。

最有可能的情况是您的重试请求失败。但是,服务器可能已处理并从您的Volley客户端发送了最后一个请求,但数据无法按时到达。

更详细:

调用在BasicNetwork类中循环,直到成功或异常。在特定异常attemptRetryOnException被调用,其中建议请求的RetryPolicy是否传递异常或忽略它并重试。通常这是DefaultRetryPolicy。 从那里你可以看到你将从Volley获得最后一次回调。

然而,监控这些重试的一种方法是通过以下方式启用标记日志:

<android-sdk>/platform-tools/adb shell setprop log.tag.Volley VERBOSE