我有一个函数可以获取服务器上文件的大小。我认识到关闭连接可能需要花费很多时间,例如10秒或更长时间。 现在我遇到了这种情况,在Android模拟器中它会永远挂起,但是在真正的设备上启动相同的应用程序它会正常运行。
有人可以解释这种行为,还是有更好的方法来关闭连接?
public static int getFileSizeFromURL(String sUrl) {
URL url;
URLConnection conn;
int size=0;
try {
url = new URL(sUrl);
conn = url.openConnection();
size = conn.getContentLength();
if(size < 0){
} else {
conn.getInputStream().close(); <----- hangs here in Simulator.
}
}
catch(Exception e) {
e.printStackTrace();
}
return size;
}
答案 0 :(得分:1)
当大小为零时,应断开连接。当大小大于零时,连接应该使输入流工作。试试下面的代码。
public static int getFileSizeFromURL(String sUrl) {
URL url;
URLConnection conn;
int size=0;
try {
url = new URL(sUrl);
conn = url.openConnection();
size = conn.getContentLength();
if(size == 0){
conn.disconnect();
}
else
conn.getInputStream(); <----- hangs here in Simulator.
}
catch(Exception e) {
e.printStackTrace();
}
return size;
}
答案 1 :(得分:0)
我认为这可能与您的代码在发出GET
请求时发出HEAD
请求有关:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("HEAD");
我不确定这是否能解决问题,但文档说
在请求之后调用HttpURLConnection的InputStream或OutputStream上的close()方法可以释放与此实例关联的网络资源
并且GET
请求肯定会使用比HEAD
请求更多的资源。除非严格要求GET
请求,否则应该避免使用它。如果您不确定服务器是否支持HEAD
请求,请先尝试HEAD
,如果第一次尝试失败,请回到GET
。