Android Volley double post when have slow request
AndroidAndroid VolleyAndroid Problem Overview
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.
Android Solutions
Solution 1 - Android
Add the 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. Change the value of multiplicator according to the DEFAULT TIMEOUT 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));
Solution 2 - Android
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 < 0, as it is checking current <= max...
I fixed double posting with setting the policy to the following
new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Solution 3 - Android
I found the solution for the double post, I just set the timeout to 0.
Solution 4 - Android
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));
Solution 5 - Android
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
)
);
Solution 6 - Android
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 :)
Solution 7 - Android
I asked a similar question here:
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.
Solution 8 - Android
please increase the setRetryPolicy time.
request.setRetryPolicy(new DefaultRetryPolicy(
30000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Volley.newRequestQueue(this).add(equest);
Solution 9 - Android
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 <= this.mMaxNumRetries;
}
Solution 10 - Android
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());
Solution 11 - Android
It's a problem of timeout error The request is execute twice so you have a double value
Try to increase the timeout error request with this code :
request.setRetryPolicy(new DefaultRetryPolicy(
DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Solution 12 - Android
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).
Solution 13 - Android
Volley request policy only one time request to avoid duplicate post
I tried this solution, but does not working
//...........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)
Full Source Code: https://androidkeynotes.blogspot.com/2020/02/volley.html
Solution 14 - Android
just maxNumRetries = 0
no work.
set TIMEOUT_MS 20000
.
request.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Solution 15 - Android
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
This worked for me.
Solution 16 - Android
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.
Solution 17 - Android
correcting the android date
fixes my problem unfortunately for testing purpose i have changed my android date and get ssl security error.
Solution 18 - Android
Best Solution:
jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(0,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Worked for me.