可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a problem with Volley POST request on slow network. Everytime I see BasicNetwork.logSlowRequests
in my LogCat, my POST request is executed twice or more resulting multiple (2 or more) postings for 1 request. I already set the retry policy to 0, but It doesn't help.
This is my LogCat
03-16 01:31:35.674: D/Volley(5984): [19807] BasicNetwork.logSlowRequests: HTTP response for request=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
This is my code
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);
Please help, I desperately finding solution for this problem.
回答1:
Add following values to your Request object
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Here: request is your object of JsonObjectRequest and change the value of multipilcator according to the DEFAULT TIME-OUT VALUE in DefaultRetryPolicy class in volley
You can also set the first argument to 0, like below
request.setRetryPolicy(new DefaultRetryPolicy(0, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
回答2:
Just setting the Timeout in the RetryPolicy to 0 is too little. After checking the source, you have to actually set the maximum number of retries
I fixed double posting with setting the policy to the following
new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Hope it helps!
回答3:
I found the solution for the double post, I just set the timeout to 0.
回答4:
I am able to solve this issue by two ways.
First is changed the RetryPolicy
. Simply set the timeout value to double of the default timeout. Worked fine. You can also try other values.
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Another way is by setting connection.setChunkedStreamingMode(0);
in openConnection
method HurlStack
class.
I am creating my RequestQueue
like this requestQueue = Volley.newRequestQueue(context, new HurlStack());
Hope it helps :)
回答5:
I found the solution for the multi post bug.
Change the RetryPolicy. I set the timeout value to 50000ms, worked fine Like this:
request.setRetryPolicy( new DefaultRetryPolicy( 500000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT ) );
回答6:
You must set the RetryPolicy to 0 retries and ensure that the timeout is bigger than the server timeout.
setRetryPolicy(new DefaultRetryPolicy("bigger than server timeout", 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
回答7:
This works for me.
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); } }
To use:
request.setRetryPolicy(new MyRetryPolicyWithoutRetry());
回答8:
I asked a similar question here:
Android Volley makes 2 requests to the server when retry policy is set to 0
I managed to solve this issue by setting the keep-alive property to false inside Android, e.g.:
System.setProperty("http.keepAlive", "false")
I added this line of code inside the class where I import requestqueue and make the requests.
Also, check if you server has the keep-alive header.
This post helped get to the solution.
回答9:
I managed to fix this by configuring HttpURLConnection like this:
connection.setChunkedStreamingMode(0);
I started a discussion about this in Volley email list (https://groups.google.com/forum/#!topic/volley-users/8PE9dBbD6iA).
回答10:
please increase the setRetryPolicy time.
request.setRetryPolicy(new DefaultRetryPolicy( 30000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); Volley.newRequestQueue(this).add(equest);
回答11:
just maxNumRetries = 0
no work. set TIMEOUT_MS 20000
.
request.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
回答12:
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
This worked for me.
回答13:
You can use this to solve the problem.
StringRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
回答14:
The only way I got the double requests to stop was to set the retry policy retries to -1
request.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0));
I think this is because the DefaultRetryPolicy's logic for attempts remaining returns true if retryCount is 0 and Max retries is also 0 in the hasAttemptRemaining() method:
protected boolean hasAttemptRemaining() { return this.mCurrentRetryCount
回答15:
Tried lot of things but in the end nothing helped, finally I figured out following combination of changes
sr.setRetryPolicy(new DefaultRetryPolicy(0,-1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
And in your hurl connection in application class add this
httpsURLConnection.setChunkedStreamingMode(0);
This worked smoothly to stop Volley hitting multiple request at server
回答16:
correcting the android date
fixes my problem unfortunately for testing purpose i have changed my android date and get ssl security error.