Android Volley double post when have slow request

AndroidAndroid Volley

Android 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:

https://stackoverflow.com/questions/26264942/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.

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionaristo_shView Question on Stackoverflow
Solution 1 - AndroidDroid_MechanicView Answer on Stackoverflow
Solution 2 - Androiduser4173064View Answer on Stackoverflow
Solution 3 - Androidaristo_shView Answer on Stackoverflow
Solution 4 - AndroidAlberto PenasView Answer on Stackoverflow
Solution 5 - AndroidxiaoyeeView Answer on Stackoverflow
Solution 6 - AndroidArun BadoleView Answer on Stackoverflow
Solution 7 - Androiduser921509View Answer on Stackoverflow
Solution 8 - AndroidJatin DevaniView Answer on Stackoverflow
Solution 9 - AndroidAmoliskiView Answer on Stackoverflow
Solution 10 - AndroidVitali PekelisView Answer on Stackoverflow
Solution 11 - AndroidPierre AlexandreView Answer on Stackoverflow
Solution 12 - AndroidpmellaahoView Answer on Stackoverflow
Solution 13 - AndroidHari Shankar SView Answer on Stackoverflow
Solution 14 - Androidayyb1988View Answer on Stackoverflow
Solution 15 - AndroidAhsanwarsiView Answer on Stackoverflow
Solution 16 - AndroidArtist404View Answer on Stackoverflow
Solution 17 - AndroidNouman ChView Answer on Stackoverflow
Solution 18 - Androidvipin yadavView Answer on Stackoverflow