我有一个简单的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项目中使用此代码。现在问题来自没有互联网连接。应用程序暂停,稍后会出错。
是否有某种方法可以在一些固定的超时后解除此问题,甚至在抛出异常后返回一些特定的字符串。你能告诉我怎么做吗??
答案 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
时的一般提示在不再需要时始终关闭它们。我只是想发布它,因为似乎大多数人都没有在他们的例子中处理它。