2011-08-22 15 views
6

Sto lavorando su un'applicazione Android che richiede l'uso di HttpClient per caricare un file dal dispositivo Android su un server web. Il file che sto caricando può raggiungere dimensioni fino a 1 Gb, pertanto i timeout possono verificarsi se il dispositivo perde la connessione durante il caricamento. La cosa strana è che il timeout impostato per il socket non sembra avere alcun effetto. L'applicazione si bloccherebbe ogni volta che perdo la connessione invece di aumentare SocketTimeoutException.Apache HttpClient 4.0 non riesce a timeout per socket su Android

Ho provato utilizzando:

HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT); 
HttpConnectionParams.setSoTimeout(params, CrashLogParams.TIMEOUT); 

ma questo ha lavorato solo per il timeout di connessione, non il timeout presa. Inoltre ho provato:

HttpParams p = httpclient.getParams(); 
p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); 
p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); 

La ragione So che timeout di connessione funziona è perché, vorrei ottenere l'eccezione per timeout di connessione dopo l'esecuzione

httpclient.execute(httppost); 

L'applicazione sembra bloccarsi quando la connessione viene persa durante il caricamento , ma dopo che l'applicazione ha effettuato correttamente una connessione al server.

Per testare la mia app, ho disattivato la rete in momenti diversi per vedere come avrebbe reagito l'applicazione. Se disattivo la rete prima di inviare la richiesta, ottengo un errore di connessione e la mia applicazione può gestirlo correttamente, ma se lo disattivo durante il caricamento l'applicazione si blocca. Ovviamente sto facendo tutte queste richieste tramite AsyncTasks, quindi il thread UI principale non si blocca. Mi sto solo chiedendo se ci sia un altro modo per assicurarsi che il socket si interrompa non ricevendo dati, o se mi manca qualcosa qui. Ho letto molti blog e post, ma molti di loro suggeriscono di utilizzare SO_TIMEOUT che non funziona per me.

sotimeout not working in a multipart http post on android 2.1

+0

La tua app ha funzionato con file di dimensioni più piccole? – momo

+0

Ho provato 1 file mb e il bug è ancora lì.Immagino che con file più piccoli avrai una maggiore probabilità di disconnessione in tempi tra i caricamenti dei file, ma questo è oltre il punto. Voglio essere in grado di rendere robusta la mia applicazione in caso di guasti alla rete. –

+0

Sto riscontrando lo stesso esatto problema, tranne che le dimensioni del caricamento sono abbastanza piccole, dell'ordine di alcuni kb. Tutto ciò che sembra essere necessario per attivare il bug è che la rete si spenga dopo che ho controllato se è attiva, ma prima chiamo execute(). – Michael

risposta

0

State creando il proprio ClientConnectionManager? Dai uno sguardo allo source per AndroidHttpClient.newInstance().

Crea un nuovo oggetto BasicHttpParams e lo passa ai costruttori sia per ThreadSafeClientConnectionManager che DefaultHttpClient. Non vedo un modo per impostare i parametri su ClientConnectionManager tranne nel costruttore.

+1

Sì Sto estendendo DefaultHttpClient per creare il mio HttpClient che abilita SSL. La classe estesa esegue l'override di createClientConnectionManager() e imposta HttpParams come indicato. Il codice che ho elencato era in grado di impostare correttamente il timeout della connessione perché quando aumentavo il tempo di timeout, anche il tempo che dovevo aspettare fino a quando veniva sollevata un'eccezione aumentava di conseguenza. L'unico problema è che il timeout del socket non viene mai generato, indipendentemente dai valori che cerco. –

0

Sto affrontando lo stesso problema di te, con lo stesso caso d'uso. Succede su una samsung galaxy s2 con Android 2.3.6 ma non con lo stesso dispositivo su 4.x. Sfortunatamente questo è esattamente il dispositivo che utilizza il mio cliente e funziona benissimo su altri 10 dispositivi di test con varie versioni Android e costruttori ...

Ho passato ore a provare con la libreria HttpUrlConnection anziché HttpClient da Apache, ma il risultato finale è la stessa. AndroidHttpClient mostra lo stesso comportamento. Questo mi porta a dire che sembra un'implementazione hardware o un problema relativo al sistema operativo ...

L'unica soluzione che ho trovato è stata quella di mettere il metodo HttpClient.execute() in una thread separata e chiamare thread.join(timeout) come protezione per interrompere il thread se qualcosa va storto Lo svantaggio è quando il caricamento funziona bene ma richiede più tempo del timeout, la richiesta viene interrotta ...

Se nel frattempo hai trovato qualcosa, sarei molto grato se tu potessi condividerlo.

Problemi correlati