2014-10-08 10 views
15

Ich arbeite an einem Android-Projekt, das Volley für asynchrone Anfragen und Imagecaching verwendet. Irgendwie trifft eine Anfrage den Server zweimal, auch wenn die Wiederholungsrichtlinie auf 0 gesetzt ist. Ich habe versucht, die Werte vom DefaultRetryPolicy-Objekt ohne Erfolg zu überschreiben. Hier ist ein Beispielcode:Android Volley macht zwei Anfragen an den Server, wenn die Wiederholungsrichtlinie auf 0 gesetzt ist

Die Anfrage:

@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-Politik:

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

    return request; 
} 

Grundsätzlich möchte ich mit 0 Wiederholungen das Timeout auf 30 Sekunden eingestellt werden.

Wenn ich die Anzahl der Wiederholungen erhöht, funktioniert es wie erwartet, aber wenn ich es auf 0 setze, macht es 2 Anfragen.

Benötigen Sie Hilfe hier.

bearbeiten

konnte ich mein Problem lösen, indem sie die Keep-Alive-Eigenschaft auf false innerhalb von Android-Einstellung. zB:

System.setProperty("http.keepAlive", "false"); 

Ich habe diese Codezeile innerhalb der Klasse, wo ich Request importieren und die Anfragen stellen.

Überprüfen Sie auch, ob Ihr Server den Keep-Alive-Header hat.

Diese post half, die Lösung zu bekommen.

+2

Sie Ihre bearbeiten als separate Antwort schreiben sollte, da sie die Lösung auf diese Frage ist Sie suchen (Selbst Antworten sind erlaubt). –

+0

Ich habe das gleiche Problem. Ich habe die Zeitüberschreitung auf 60 Sekunden erhöht, da Wiederholungen zweimal ausgeführt werden, obwohl ich DefaultRetryPolicy (60000, 0, 0) habe. Warum? – portfoliobuilder

+0

Dies ist sicherlich keine Antwort auf Ihr Problem, aber ein Nebeneffekt, dass das Problem nicht auftritt. Es gibt 2 Dinge nicht klar: 1) setDefaultRetryPolicy Sie eingefügt wird wo und wann als Volley's ImageRequest setzt seine eigene RetryPolicy 2) das ist der HTTP-Stack, den Sie verwenden, weil HURL okhttp für einige Zeit verwendet und es hat eine erneute Wiederholung Anfragen Das Beantworten dieser kann dazu führen, dass Sie wirklich herausfinden, warum das passiert. – djodjo

Antwort

1

Ich benutze dies die no-repeat-Richtlinie festgelegt:

myRequest.setRetryPolicy(new DefaultRetryPolicy(0, 
      DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
0

Gerade gesetzt Timeout 20second oder mehr, wie Sie wollen, und auf 0

req.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 0, 
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
1

Das hasAttemptRemaining des DefaultRetryPolicy.class wiederholen () Klasse sieht wie folgt aus:

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

Von dem, was ich sehen kann, werden die maxNumRetries auf 0 setzen stil lch mache das zurück, wenn es noch keine Wiederholung versucht hat.

Ich reparierte es mit einem

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

Außer dass 'mCurrentRetryCount' in' retry' vor dem Aufruf von 'hasAttempertRemaining()' inkrementiert wird, funktioniert die Einstellung der Wiederholungsanzahl auf 0 korrekt. –

Verwandte Themen