如何处理Java中的网络连接问题

时间:2010-11-17 21:59:19

标签: java android

我有一个简单的java代码,它从输入url获取html文本:

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项目中使用此代码。现在问题来自没有互联网连接。应用程序暂停,稍后会出错。

是否有某种方法可以在一些固定的超时后解除此问题,甚至在抛出异常后返回一些特定的字符串。你能告诉我怎么做吗??

4 个答案:

答案 0 :(得分: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();
     }

一个空的挡块正在寻找麻烦。

答案 1 :(得分:1)

我不知道URL的默认超时是什么,快速查看javadoc似乎没有透露任何内容。因此,请尝试直接使用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(); 
}

您也可以设置读取时间,以及指定重定向行为和其他一些内容。

答案 2 :(得分:1)

我认为除了超时之外,在请求之前检查互联网可用性也很明智:

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

更新:对于超时,请参阅优秀的kuester2000的回复here

答案 3 :(得分:0)

使用Stream时的一般提示在不再需要时始终关闭它们。我只是想发布它,因为似乎大多数人都没有在他们的例子中处理它。