Quindi sto utilizzando Google Volley
per la richiesta HTTP, che in pratica utilizza .Android (Java) HttpURLConnection ritentivo silenzioso su timeout 'lettura'
Secondo le mie prove, il problema è questo :
Quando la 'lettura' timeout sulle HttpURLConnection
raggiunge, un secondo tentativo silenzioso viene eseguito prima che la connessione è chiusa e l'eccezione relativa gettato (SocketTimeoutException
).
Nota che:
- Ho notato questo errore quando si utilizza HTTP POST
richiesta.
- Il timeout 'lettura' è diverso dal timeout 'connect'.
- Se il timeout di 'lettura' (impostato chiamando connection.setReadTimeout(int)
) NON è impostato su (0) o impostato su un valore superiore a connection.setConnectTimeout(int)
, questo errore non si verifica.
- Questo problema è stato discusso, ad esempio here, ma non ho trovato alcuna soluzione soddisfacente.
- Una questione in qualche modo correlato può essere trovato here, ma non sono sicuro che è rilevante
Più Sfondo
mia app viene utilizzata per pagare i soldi, quindi non ritentare la richiesta è (è?) fondamentale (sì, so che può essere gestito dal server, voglio comunque che il mio cliente sia "corretto").
Quando viene impostato il timeout di 'lettura', nel caso in cui la connessione al server sia stabilita, ma il server attende/dorme/fa ritardare-risposta quel tempo di "timeout" prima di rispondere (sollevando così l'eccezione di 'lettura' e non il ' connect 'exception), un'altra richiesta (silenziosa) viene inviata appena prima che tale eccezione venga sollevata, risultando in 2 richieste simili, che non sono accettabili.
Che tipo di soluzione sto cercando?
Bene, uno che risolverà bene questo problema/bug, proprio come la correzione spiegata here (ma, ancora una volta, penso che sia irrilevante in questo caso).
Inoltre, vorrei mantenere il flusso originale così com'è, ovvero non forzare la chiusura della connessione o qualcosa del genere.
Quello che sto per fare ora è impostare il timeout di "lettura" su due volte il timeout della "connessione" (iniziano a contare allo stesso tempo), per assicurarsi che l'eccezione di "connessione" venga sollevata per prima. Cercherò anche di superare questo problema sul lato server. Il problema è che questo timeout di 'lettura' esiste per un motivo, e la mia attuale implementazione praticamente la ignora e gestisce solo i timeout di 'connessione'.
EDIT Il Volley
biblioteca di RetryPolicy
non ha alcun effetto su questo tema, in quanto questo è un nuovo tentativo silenzioso. Ho cercato il più profondo possibile all'interno della biblioteca. Registri/punti di interruzione in tutto il mondo, ha annullato le chiamate per riprovare. Quello che so è il 99,99% di un problema HttpURLConnection
.
erano si in grado di risolverlo? –
Non è una soluzione perfetta, ma come ho detto, quando sto facendo ora, è impostato il timeout di 'lettura' a uguale o due volte il timeout della 'connessione'. Risponderò alle altre persone per vedere facilmente questa soluzione. –