2012-08-24 8 views
1

C'est la situation dans laquelle je suis face avec le code ci-dessous:Android HttpURLConnection très lent

Comme vous pouvez le voir, je suis en train de lire un flux HTTP. Quand je lance le code suivant sur le simulateur Android, il fonctionne 100% du temps, quand je cours le code suivant sur mon Galaxy S3 alors que sur 3G il fonctionne 100% du temps, quand j'essaye de me connecter à l'URL en utilisant mon ordinateur portable navigateur il fonctionne à 100% du temps, quand j'essaie de me connecter en utilisant le navigateur Galaxy S3 (à la fois en wifi et 3g) cela fonctionne ... 100% du temps. Cependant, lorsque j'essaie de me connecter en utilisant mon Galaxy S3 en Wi-Fi, je passe environ 80% du temps. Si je supprime les propriétés de délai d'attente, je reçois des exceptions étranges telles que:

"recvfrom failed: ETIMEDOUT" 
"failed to connect to <URL>: connect failed: ENETUNREACH (Network is unreachable)" 
"unable to resolve the host <URL>: no address associated with hostname" 

Je suis ouvert à toute suggestion ...

public static final String getHttpResponse(String url) 
{ 
    HttpURLConnection conn = null; 
    InputStream response = null; 
    try { 
     URL address = new URL(url); 
     conn = (HttpURLConnection)address.openConnection(); 
     conn.setConnectTimeout(30 * 1000); //30 seconds 
     conn.setReadTimeout(30 * 1000); //30 seconds 

     response = conn.getInputStream(); 

     if(conn.getResponseCode() != HttpURLConnection.HTTP_OK) { 
      Log.e("Util.getHttpResponse", Integer.toString(conn.getResponseCode())); 
      return null; 
     } 

     String result = Util.streamToString(response); 
     return result; 

    } catch(IOException e) { 
     response = conn.getErrorStream(); 
     Log.e("Util.getHttpResponse", Util.streamToString(response)); 
     return null; 

    } finally { 
     if(response != null) { 
      try { 
       response.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     if(conn != null) { 
      conn.disconnect(); 
     } 
    } 
} 

MISE À JOUR: - en utilisant AndroidHttpClient n'a pas fonctionné - Après avoir obtenu le flux d'entrée j'ai eu une erreur popup juste dans l'IDE eclipse ... Comme vous pouvez voir mon curseur de débogage fait tout le chemin à la ligne 107 .. bien après avoir fini d'obtenir le flux d'entrée cette fois-ci ... Eclipse

Répondre

0

À titre expérimental, que se passe-t-il si vous essayez d'utiliser la classe AndroidHttpClient à la place pour faire la même chose? Il a quelques délais d'attente prédéfinis et d'autres paramètres qui, nous a-t-on dit, devraient fonctionner correctement dans la plupart des cas.

+0

Merci, je vais donner un coup de feu et répondre en retour. Cependant, j'ai essayé d'utiliser org.apache.http.client.HttpClient et obtenait les mêmes résultats. – Cailen

1

J'ai le même problème sur un appareil Android. J'utilise une adresse IP dans l'url. Finalement, j'ai trouvé que la méthode HttpURLConnection.connect (...) impliquait le getHostName() en interne. Après cela, j'utilise le domaine dans l'url, alors ça marche 100% du temps.