2014-06-25 14 views
8

Sto utilizzando HttpURLConnection su Android KitKat per POST alcuni dati su un server. Il server impiega molto tempo per rispondere e la connessione riprende silenziosamente da 1 a 3 volte prima del timeout. Non voglio che riproverà, poiché il server agisce su tutte le richieste, risultando in Bad Things (TM).Interruzione dei tentativi silenziosi in HttpURLConnection

Ho provato System.setProperty("http.keepAlive", "false") prima di aprire la connessione, ma che non aiuta.

+0

Hai provato [setReadTimeout] (http://docs.oracle.com/javase/7/docs/api/java/net/URLConnection.html#setReadTimeout (int))? Se la risposta del server richiede molto tempo ma non invia alcun pacchetto fino a quel momento, probabilmente potrebbe funzionare. – hgoebl

+0

Già usando setReadTimeout(). –

+0

Sei sicuro la vostra utilizzando il nativo 'HttpURLConnection' e non un'implementazione personalizzata come' 'okhttp' o Volley'? AFAIK l'implementazione dello stock non riprova su SocketTimeoutExceptions. –

risposta

0
  • implementare un timeout difficile te stesso, e la forza di chiudere la HttpURLConnection da calling disconnect. Questo può essere fatto dal tuo Activity usando android handler; Se si utilizza AsyncTask, si può semplicemente chiamare cancel o Thread.interrupt():

    new Handler().postDelayed(new Runnable() { 
        public void run() { 
         httpUrlConnTask.cancel(true); 
        } 
    }, timeout * 1000); 
    

    E nel vostro httpUrlConnTask, chiamare disconnect:

    if (isCancelled()) { 
        urlConnection.disconnect(); 
        return; 
    } 
    

    si può avere a che fare urlConnection in un altro thread bambino interno, in modo che si può fare un ciclo while nel monitoraggio AsyncTask per isCancelled. E un try..catch così puoi chiudere tutti gli stream correttamente.

  • hai già keepAlive false e readTimeout, aggiungi connection timeout too. Questo imposterà il timeout del socket.

+0

puoi postare l'intero codice im nuovo a Handler e suggerire quando usare Handler e AsyncTask – LMK

+0

puoi confermare quella chiamata urlConnection.disconnect(); risolto il mio problema atleast di tentativi indesiderati automatizzati –

-4

Android’s HTTP Clients

Prima di Froyo, HttpURLConnection avuto alcuni bug frustrante. In particolare, la chiamata close() su un InputStream leggibile potrebbe essere poison the connection pool. Ovviare a questo disabilitando il pool di connessioni:

private void disableConnectionReuseIfNecessary() { 
    // HTTP connection reuse which was buggy pre-froyo 
    if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) { 
     System.setProperty("http.keepAlive", "false"); 
    } 
} 
+0

Leggi ulteriori informazioni qui http://android-developers.blogspot.com/2011/09/androids-http-clients.html –

-1

è necessario impostare System.setProperty("sun.net.http.retryPost", "false")

+0

Non credo che questo funziona con l'attuazione HttpURLConnection di Android. – ubuntudroid

2

Per le chiamate POST impostare

httpURLConnection.setChunkedStreamingMode(0); 

e questo dovrebbe risolvere i tentativi silenziosi. È possibile trovare la segnalazione di bug e la soluzione alternativa here.

+0

Per una più profonda comprensione per il problema [leggere questo] (http://stackoverflow.com/a/37675253/2061089). – oli

Problemi correlati