2014-10-08 12 views
15

Sto lavorando a un progetto Android che utilizza Volley per richieste asincrone e imagecaching. In qualche modo una richiesta sta colpendo il server due volte anche quando ho impostato il criterio retry su 0. Ho provato a sovrascrivere i valori dall'oggetto DefaultRetryPolicy senza successo. Ecco alcuni esempi di codice:Android Volley invia 2 richieste al server quando il criterio di retry è impostato su 0

La richiesta:

@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; 
       } 


      })); 
     } 
    }); 
} 

politica Riprova:

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

    return request; 
} 

Fondamentalmente, voglio impostare il timeout a 30 secondi con 0 tentativi.

Se aumento il numero di tentativi, funziona come previsto, ma se lo imposto su 0 esegue 2 richieste.

Ho bisogno di aiuto qui.

Modifica

sono riuscito a risolvere il mio problema impostando la proprietà keep-alive su false Android all'interno. es .:

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

Ho aggiunto questa riga di codice all'interno della classe in cui importa la richiesta e faccio le richieste.

Inoltre, controllare se il server ha l'intestazione keep-alive.

Questo post ha aiutato ad arrivare alla soluzione.

+2

Si consiglia di inviare la tua modifica come una risposta separata, dal momento che è la soluzione a questo problema che cercavate (auto-risposte sono ammessi). –

+0

Sto riscontrando lo stesso problema. Ho aumentato il timeout a 60 secondi, perché i tentativi continuano a funzionare due volte anche se ho DefaultRetryPolicy (60000, 0, 0). Perché? – portfoliobuilder

+0

questo non è sicuramente una risposta al tuo problema, ma un effetto collaterale che fa sì che il problema non si verifichi. ci sono 2 cose non chiari: 1) setDefaultRetryPolicy che hai incollato viene chiamato dove e quando ImageRequest di Volley imposta il proprio RetryPolicy 2) che è lo stack http che usi perché HURL usa okhttp per qualche tempo e ha un nuovo tentativo silenzioso richieste Rispondere a quelle potrebbe portare a scoprire davvero perché questo sta accadendo – djodjo

risposta

1

Io lo uso per impostare la politica no-repeat:

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

Basta impostare il timeout per 20second o più come si desidera, e riprovare a 0

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

Il hasAttemptRemaining del DefaultRetryPolicy.class () classe:

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

Da quello che posso vedere, impostando maxNumRetries su 0 sarà Lo restituisco vero se non ha ancora fatto un tentativo.

ho fissato con un

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

Tranne che il 'mCurrentRetryCount' viene incrementato in' riprova' prima di chiamare 'hasAttemptRemaining()', quindi l'impostazione del numero di tentativi su 0 funziona correttamente qui. –