Android Volley双帖时请求缓慢

ari*_*_sh 58 android android-volley

我对慢速网络上的Volley POST请求有问题.每次我BasicNetwork.logSlowRequests在LogCat中看到,我的POST请求都会执行两次或更多次,从而产生多个(2次或更多次)1个请求的帖子.我已经将重试策略设置为0,但它没有帮助.

这是我的LogCat

03-16 01:31:35.674:D/Volley(5984):[19807] BasicNetwork.logSlowRequests:请求的HTTP响应= <[] http:// [myserver]/api/places 0xfa7d0c33 NORMAL 1> [lifetime = 3824 ],[size = 313],[rc = 200],[retryCount = 0] 03-16 01:31:35.704:D/Volley(5984):[1] Request.finish:3853 ms:[] http://[myserver]/api/places 0xfa7d0c33 NORMAL 1

这是我的代码

JSONObject body = new JSONObject();
try {
    body.put(PROTO_BODY_AUTHORIZATION, Sessions.getActiveSession().getToken());
} catch (JSONException e) {
    e.printStackTrace();
}

JsonObjectRequest request = new JsonObjectRequest(
        Request.Method.POST,
        context.getResources().getString(R.string.server_address) + "/places",
        body,
        callback,
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(context, error.getMessage(), Toast.LENGTH_LONG).show();
            }
        }
);

request.setRetryPolicy(
        new DefaultRetryPolicy(
                DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
                0,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    getRequestQueue().add(request);
Run Code Online (Sandbox Code Playgroud)

请帮忙,我拼命寻找这个问题的解决方案.

小智 45

将以下值添加到Request对象:

request.setRetryPolicy(new DefaultRetryPolicy(
    DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2,
    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Run Code Online (Sandbox Code Playgroud)

这里: request是JsonObjectRequest的对象.根据Volley中DefaultRetryPolicy类中的DEFAULT TIMEOUT VALUE更改乘数的值.

您还可以将第一个参数设置为0,如下所示:

request.setRetryPolicy(new DefaultRetryPolicy(
    0,
    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Run Code Online (Sandbox Code Playgroud)


小智 17

只是将RetryPolicy中的Timeout设置为0太小了.检查源后,您必须实际设置最大重试次数<0,因为它检查当前<= max ...

我修改了双重发布,并将策略设置为以下内容

new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!


ari*_*_sh 9

我找到了双帖的解决方案,我只是将超时设置为0.

  • 显然不,似乎0意味着没有超时.正如我所发现的,如果凌空到达超时,它将触发另一个请求.因此将超时设置为0可防止凌空发射另一个请求. (5认同)
  • 我对此不太确定.我刚刚将超时时间增加到30000毫秒才能暂时延迟. (3认同)
  • 你能详细说明一下吗?将超时设置为 0 可能会导致更多请求触发,对吗? (2认同)