Android Volley double post when have slow request

匿名 (未验证) 提交于 2019-12-03 02:45:02

问题:

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.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!