Android Volley双帖时请求缓慢

时间:2014-03-15 19:01:22

标签: android android-volley

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

这是我的LogCat

  

03-16 01:31:35.674:D / Volley(5984):[19807]   BasicNetwork.logSlowRequests:请求的HTTP响应=< []   http://[myserver]/api/places 0xfa7d0c33正常1> [寿命= 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正常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);

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

19 个答案:

答案 0 :(得分:44)

将以下值添加到Request对象:

request.setRetryPolicy(new DefaultRetryPolicy(
    DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2,
    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

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

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

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

答案 1 :(得分:15)

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

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

new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

希望它有所帮助!

答案 2 :(得分:9)

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

答案 3 :(得分:4)

您必须将RetryPolicy设置为0次重试,并确保超时大于服务器超时。

setRetryPolicy(new DefaultRetryPolicy("bigger than server timeout",
                                      0,
                                      DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

答案 4 :(得分:4)

我找到了多帖错误的解决方案。

更改RetryPolicy。 我将超时值设置为50000ms,工作正常 像这样:

<ul id="menu">
  <li>Home</li>
  <li>Store</li>
  <li>Blog</li>
  <li>About</li>
  <li>Contact</li>
</ul>

答案 5 :(得分:3)

我能够通过两种方式解决这个问题。

首先更改RetryPolicy。 只需将超时值设置为默认超时的两倍即可。工作得很好。您也可以尝试其他值。

request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

另一种方法是在connection.setChunkedStreamingMode(0);方法openConnection类中设置HurlStack

我正在创建我的RequestQueue requestQueue = Volley.newRequestQueue(context, new HurlStack());

希望有所帮助:)

答案 6 :(得分:2)

这是超时错误的问题 该请求执行了两次,所以您有一个双精度值

尝试使用以下代码增加超时错误请求:

request.setRetryPolicy(new DefaultRetryPolicy(
DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

答案 7 :(得分:2)

这适合我。

public class MyRetryPolicyWithoutRetry implements RetryPolicy
{
    @override
    public int getCurrentTimeout()
    {
        return CONNECTION_TIME_OUT; /200000/
    }

    @Override
    public int getCurrentRetryCount()
    {
        return 0;
    }

    @Override
    public void retry(VolleyError error) throws VolleyError
    {
        throw(error);
    }
}

使用:

request.setRetryPolicy(new MyRetryPolicyWithoutRetry());

答案 8 :(得分:2)

请增加setRetryPolicy时间。

request.setRetryPolicy(new DefaultRetryPolicy(
                    30000,
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
            Volley.newRequestQueue(this).add(equest);

答案 9 :(得分:2)

我在这里问了一个类似的问题:

Android Volley makes 2 requests to the server when retry policy is set to 0

我设法通过在Android中将keep-alive属性设置为false来解决此问题,例如:

System.setProperty("http.keepAlive", "false")

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

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

post帮助找到了解决方案。

答案 10 :(得分:1)

您可以使用它来解决问题。

StringRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

答案 11 :(得分:1)

我获得双重请求的唯一方法是将重试策略重试次数设置为-1

request.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0));

我认为这是因为如果retryCount为0并且hasAttemptRemaining()方法中的Max retries也为0,则DefaultRetryPolicy的剩余尝试逻辑将返回true:

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

答案 12 :(得分:1)

排球请求政策只有一次请求,以避免重复发帖

我尝试了此解决方案,但不起作用

//...........solution 01
jsonObjectRequest.retryPolicy = DefaultRetryPolicy(
120000, 
0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)


or

//...........solution 02
jsonObjectRequest.retryPolicy = DefaultRetryPolicy(
0, 
-1,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)


MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest)

完整源代码:https://androidkeynotes.blogspot.com/2020/02/volley.html

答案 13 :(得分:1)

我设法通过配置HttpURLConnection来解决这个问题:

connection.setChunkedStreamingMode(0);

我在Volley电子邮件列表(https://groups.google.com/forum/#!topic/volley-users/8PE9dBbD6iA)中开始讨论这个问题。

答案 14 :(得分:0)

request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

这对我有用。

答案 15 :(得分:0)

只是maxNumRetries = 0没有工作。 set TIMEOUT_MS 20000

request.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

答案 16 :(得分:0)

尝试了很多事情,但最终没有任何帮助。最后,我想出了以下组合的变化:

sr.setRetryPolicy(new DefaultRetryPolicy(0,-1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

在应用程序类的连接中,添加:

httpsURLConnection.setChunkedStreamingMode(0);

这很顺利地阻止了Volley在服务器上发出多个请求。

答案 17 :(得分:0)

纠正android date修复了我的问题,遗憾的是我已经更改了我的android日期并获得了ssl安全性错误。

答案 18 :(得分:0)

最佳解决方案:

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

为我工作。