2010-11-17 26 views
1

我有一個簡單的Java代碼,從輸入Url獲取HTML文本:如何與網絡連接處理問題在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){} 

我使用此代碼在Android項目。現在問題出現在沒有互聯網連接的情況下。該應用程序只是暫停,然後給出錯誤。

是否有某種方法可以在某些固定的超時後打破這種情況,甚至在拋出異常後返回某些特定的字符串。你能告訴我怎麼做嗎?

回答

1

我不知道URL的默認超時值是什麼,快速查看javadocs似乎沒有發現任何東西。所以請嘗試直接使用HttpURLConnection而不是http://download.oracle.com/javase/1.5.0/docs/api/java/net/HttpURLConnection.html。這使您可以設置超時值:

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(); 
} 

您還可以設置讀取超時,以及,以及指定的行爲再重定向和其他一些東西。

+0

Thankyou所有,順便說一句理查德你的答案簡單而高效。它解決了我所有的問題。我可以同時執行這兩項任務,檢查字符串是否爲空值,超時值是否可以作爲待遇。 非常感謝。 – Rizwan 2010-11-17 23:21:46

+0

@Rizwan - np :) – 2010-11-18 09:48:11

2

試試這個:

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(); 
    } 

一個空的catch塊是自找麻煩。

1

我想除了超時也可能是還聰明的請求權之前檢查Internet可用性:

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); 
    } 
} 

UPDATE:對於超時看到一個優秀的kuester2000的回覆here

+1

當你測試它的時候它被連接了,但是當你閱讀時沒有連接的情況怎麼樣?這種事情是徒勞的。無論如何,你必須處理特殊情況,沒有意義的是兩次。一般來說,查看資源是否可用的方法是嘗試將其用於您需要的目的。其他任何事情基本上都是要求電腦預測未來。 – EJP 2010-11-18 08:19:24

0

只要在與Stream合作時使用的一般技巧總是在不再需要時關閉它們。我只是想將其發佈,因爲似乎大多數人沒有在他們的例子中關心它。

+0

當然會照顧這一點。謝謝你的提示。 – Rizwan 2010-11-17 23:27:44