Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
802 views
in Technique[技术] by (71.8m points)

asynchronous - Android Volley makes 2 requests to the server when retry policy is set to 0

I'm working on an Android project that uses Volley for async requests and imagecaching. Somehow a request is hitting the server twice even when I have the retry policy set to 0. I tried overriding the values from the DefaultRetryPolicy object with no success. Here's some sample code:

The request:

@Override
public void gravarVendaMobile(final Usuario usuarioAutenticado, final AsyncCallback<String> callback) {
    obterParametrosDeInicializacao().done(new DoneCallback<ParametrosDeInicializacao>() {
        @Override
        public void onDone(final ParametrosDeInicializacao param) {
            requestQueue.add(setDefaultRetryPolicy(new StringRequest(
                    Method.POST,
                    urlPara(GRAVAR_VENDA_MOBILE, usuarioAutenticado.getFilial(), usuarioAutenticado.getCodigo()),
                    listener(callback),
                    //errorListener(R.string.could_not_load_produtos, callback)
                    new ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            callback.onError(new MessageCodeException(error.networkResponse.statusCode, error));
                        }
                    }
            ) {

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> headers = new HashMap<String, String>();
                    headers.put("Encoding", "UTF-8");
                    headers.put("Accept", "application/json");
                    headers.put("Content-type", "application/json; charset=UTF-8");
                    return headers;
                }


            }));
        }
    });
}

Retry Policy:

private Request<?> setDefaultRetryPolicy(Request<?> request) {
    request.setRetryPolicy(new DefaultRetryPolicy(30000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

    return request;
}

Basically, I want to set the timeout to 30 secs with 0 retries.

If I increase the number of retries it works as expected, but if I set it to 0 it makes 2 requests.

Need some help here.

Edit

I managed to solve my issue by setting the keep-alive property to false inside android. eg:

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The DefaultRetryPolicy.class's hasAttemptRemaining() class looks like this:

protected boolean hasAttemptRemaining() {
    return this.mCurrentRetryCount <= this.mMaxNumRetries;
}

From what I can see, setting the maxNumRetries to 0 will still make that return true if it hasn't done a retry yet.

I fixed it with a

request.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...