URL连接有时会挂起

时间:2017-01-29 12:21:23

标签: android httpurlconnection hang

我有一个函数可以获取服务器上文件的大小。我认识到关闭连接可能需要花费很多时间,例如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;
}

2 个答案:

答案 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