2012-03-16 15 views
5

Ciao Ho già fatto questa domanda, ma questa volta controllo questo metodo per consentire che tutto il certificato non stia causando problemi.Android - Periodicamente si verifica un timeout HttpClient

Sviluppo un'applicazione che è anche su iPhone. Il problema è con le richieste API. Ho impostato i timeout per tutte le richieste. A volte si verifica una pausa da 30 a 60 secondi. Sembra che l'app faccia coppia richiesta e che interrompa, tutti i timeout, dopo circa 45 secondi tutto ok.

Non so se questo è un problema del server o Android.

Questo problema non si verifica su iPhone con iOS 5, ma anche apear su IOS 4.

verifico per HttpClient e anche fot HttpsURLConnection.

La connessione è https, inoltre stava provando direttamente l'indirizzo IP.

Tutte le richieste hanno lo stesso problema, tutte le richieste sono in attività asincrone.

Tutti loro sembra la stessa:

DefaultHttpClient client = new HttpSupport().getNewHttpClient(); 

    client.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST,AuthScope.ANY_PORT),new UsernamePasswordCredentials(user, pass)); 

    HttpGet httget = new HttpGet("xxxxxxxxxxxxxxxxxxxxxxx"); 
    httget.setHeader("Accept", "application/json"); 

    HttpResponse respond = null; 

    try 
    { 
     respond = client.execute(httget); 
    } 
    catch (ClientProtocolException e) 
    { 
     Log.e(TAG,"getEvents, ClientProtocolException"); 
    } 
    catch (IOException e) 
    {   
     Log.e(TAG,"getEvents, IOException: " + e.getMessage()); 
    } 

Il codice dor mia classe HttpSupport è nella mia interrogazione prev: Android - API Requests

È può essere colpa del server? Grazie per l'aiuto.

Recentemente ho notato che l'app è bloccata su client.execute ... prova a fare così: android httpclient hangs on second request to the server (connection timed out), ma non serve. Forse non è un errore API, ma Android così com'è. Questa app punta l'API molto spesso, ma per la maggior parte delle richieste tutto va bene.

Ancora non riesco a sbarazzarsi dei 30-45 secondi di riagganciare.

Oggi ho testato di nuovo l'app e ho notato che l'errore si verifica solo sulla connessione wi-fi su Samsung Tablet con 3.2. Su Wildfire con 2.3.7 (wi-fi e 3g) tutto sembra andar bene. Non sto dicendo che il problema non si verifica sui dispositivi mobili, ma mentre stavo testando non ho notato i timeout.

risposta

3

Il client ha impostato un timeout troppo breve - su una connessione mobile è necessario attendere fino a 30 secondi per la connessione e 30 secondi oltre per ricevere una risposta.

tuo codice (tramite il vostro link):

int timeoutConnection = 3000; 
     HttpConnectionParams.setConnectionTimeout(params, timeoutConnection); 
     // Set the default socket timeout (SO_TIMEOUT) 
     // in milliseconds which is the timeout for waiting for data. 
     int timeoutSocket = 5000; 
     HttpConnectionParams.setSoTimeout(params, timeoutSocket); 

È in millisecondi. Quindi il timeout della connessione è di 3 secondi e la risposta è di 5 secondi.

Farei rispettivamente 30000 e 60000.

Inoltre, se si desidera escludere eventuali problemi del server, installare un proxy HTTP come fiddler2 e utilizzarlo per visualizzare ogni richiesta HTTP/HTTPS e verrà visualizzata ogni risposta del server. Vedrai quindi se il client o il server non funziona correttamente.

+0

Sei sicuro dei tempi? Ho questo problema anche se utilizzo i dispositivi su Wi-Fi ei ragazzi di api mi inviano una risposta 'volte, ogni 0,5 secondi. – goodm

+0

Non è il 100% il tuo problema, ma sicuramente sono troppo brevi per tutti gli scenari di connettività che potresti dover affrontare. Ma è per questo che consiglio di correre con Fiddler: aiuterà a mettere in evidenza il tuo problema. – peterept

+0

Purtroppo anche se cambio i timeout non risolverà il mio problema, allungherà solo i tempi di attesa. – goodm

2

Non ho una spiegazione chiara del problema, ma ho dato un'occhiata al codice e penso ci siano alcuni errori di progettazione nel codice che potrebbero nascondere qualche difetto nascosto di cui lo sviluppatore dovrebbe occuparsi in fase di compilazione, invece di lasciarli e lasciarli fuoriuscire in fase di runtime.

Nella tua HttpSupport.getNewHttpClient() implementazione:

public DefaultHttpClient getNewHttpClient() { 
    try { 
    ... ... 

    ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

    return new DefaultHttpClient(ccm, params); 
    } catch (Exception e) { 
    return new DefaultHttpClient(); 
} 

}

ritorni un'istanza HttpClient sia cercare di blocco catch, dove l'uno dal blocco try restituisce un robusto HttpClient che a conoscenza corretta protocollo, credenziali, ecc. utilizzati per accedere al server HTTP remoto. Qual è il punto di ritorno di un altro HttpClent nudo nel blocco catch quando si è verificata un'eccezione. Solitamente l'eccezione indica che si è verificato un errore previsto e che dovrebbe essere gestito dallo sviluppatore in fase di compilazione, ciò che hai fatto è semplicemente ignorare tutte le avvertenze utili e lasciarle trapelare al momento dell'applicazione e, peggio ancora, senza visibilità per sapere cosa è successo durante l'esecuzione tempo.

Quindi il primo tentativo di identificare il problema è modificare il codice per gestire correttamente l'eccezione, è sufficiente stampare la traccia dello stack di eccezioni e individuare quali sono i potenziali problemi durante la creazione/inizializzazione di HttpClient.

Un altro punto che vorrei menzionare è creare/inizializzare HttpClient su richiesta, ovvero creare e inizializzare la nuova istanza di HttpClient ogni volta che è necessario inviare una richiesta HTTP, che potrebbe non essere correlata al tuo problema IMO.

Il mio problema è probabilmente legato alla creazione/inizializzazione di HttpClient in ambiente multithread (come hai detto tu usi AsyncTask), poiché HttpClient non è thread-safe. spero che questo ti aiuti.

+0

Sì, stavo pensando a questo, ma quando ho inserito Log.e ("HttpClient", e.toString()); in catch exception non si verifica mai nei miei log. Quindi questo non è la causa di questo. Ho iniziato a supporre che si tratta di un errore del server, non l'app. – goodm

+0

Tuttavia, restituire HttpClient nudo nel blocco catch è un'assurdità assoluta. Come fa la tua app a sollevare la richiesta HTTP? c'è qualche posto nella tua app che genera e alza più richieste HTTP simultaneamente (tramite AsyncTask)? – yorkw

Problemi correlati