2010-11-17 4 views
1

J'ai un simple code java qui obtient le texte HTML à partir de l'url d'entrée:Comment gérer problème avec la connectivité réseau en Java

try { 
    URL url = new URL("www.abc.com"); 
    // Get the response 
    BufferedReader rd = new BufferedReader(new InputStreamReader(url.openStream())); 

     while ((line = rd.readLine()) != null) { 
     String code = code + line; 

    } catch (IOException e){} 

J'utilise ce code dans un projet Android. Maintenant, le problème vient quand il n'y a pas de connectivité Internet. L'application s'arrête juste et donne plus tard une erreur.

Y a-t-il un moyen de casser ceci après un certain délai d'attente, ou même de retourner une chaîne spécifique après qu'une exception soit levée. Pouvez-vous me dire comment faire ça?

Répondre

1

Je ne sais pas quel est le délai d'attente par défaut pour l'URL, et un coup d'œil sur les javadocs ne semble rien révéler. Essayez donc d'utiliser HttpURLConnection directement à la place http://download.oracle.com/javase/1.5.0/docs/api/java/net/HttpURLConnection.html. Cela vous permet de définir des valeurs: délai d'attente

public static void main(String[] args) throws Exception { 

    URL url = new URL("http://www.google.com"); 

    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
    conn.setConnectTimeout(5000); // 5 seconds 
    conn.setRequestMethod("GET");  
    conn.connect(); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

    String line; 
    while ((line = rd.readLine()) != null) { 
     System.out.println(line); 
    } 
    conn.disconnect(); 
} 

Vous pouvez également définir un temps de lecture comme bien, ainsi que définir le comportement re redirections et quelques autres choses.

+0

Merci à tous, d'après Richard, votre réponse était simple et efficace. Cela a résolu tout mon problème. Je peux faire les deux tâches, en vérifiant la chaîne pour la valeur nulle et le délai d'attente fonctionne comme un régal. merci beaucoup. – Rizwan

+0

@Rizwan - np :) –

2

Essayez ceci:

try 
    { 
     URL url = new URL("www.abc.com"); 
     String newline = System.getProperty("line.separator"); 
     InputStream is = url.openStream(); 
     if (is != null) 
     { 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 

     StringBuilder contents = new StringBuilder(); 
     while ((line = rd.readLine()) != null) 
     { 
      contents.append(line).append(newline); 
     }   
     } 
     else 
     { 
      System.out.println("input stream was null");    
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

Un bloc catch vide est d'avoir des ennuis.

1

Je pense que, en plus de temps morts, il pourrait être judicieux aussi de vérifier la disponibilité d'Internet juste avant la demande:

public class ConnectivityHelper { 

    public static boolean isAnyNetworkConnected(Context context) { 
     return isWiFiNetworkConnected(context) || isMobileNetworkConnected(context); 
    } 

    public static boolean isWiFiNetworkConnected(Context context) { 
     return getWiFiNetworkInfo(context).isConnected(); 
    } 

    public static boolean isMobileNetworkConnected(Context context) { 
     return getMobileNetworkInfo(context).isConnected(); 
    } 

    private static ConnectivityManager getConnectivityManager(Context context) { 
     return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    } 
} 

MISE À JOUR: Pour les délais d'attente voir un excellent kuester2000 de répondre here.

+1

Qu'en est-il du cas où il était connecté quand vous l'avez testé mais pas quand vous avez fait la lecture? Ce genre de chose est futile. Vous devez gérer les cas exceptionnels de toute façon, inutile de tout faire deux fois. En général, la façon de voir si une ressource est disponible est d'essayer de l'utiliser dans le but pour lequel vous avez besoin de l'utiliser. Tout le reste demande essentiellement à l'ordinateur de prédire l'avenir. – EJP

0

Juste une astuce générale sur le travail avec Stream s toujours les fermer quand ils ne sont plus nécessaires. Je voulais juste poster cela, car il semble que la plupart des gens ne s'en sont pas occupés dans leurs exemples.

+0

Sure prendra soin de cela. Merci pour le conseil. – Rizwan

Questions connexes