我在慢速网络上遇到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);
请帮忙,我拼命寻找解决这个问题的方法。
答案 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));
为我工作。