【问题标题】:URL Connection close hangs sometimesURL 连接关闭有时会挂起
【发布时间】:2017-01-29 12:21:22
【问题描述】:

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

【问题讨论】:

    标签: android httpurlconnection freeze


    【解决方案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;
            }
    

    【讨论】:

    • 据我所知,URLConnection 类没有close() 方法。
    • 正确它没有关闭。我过去也试过这个。
    【解决方案2】:

    我认为这可能与您的代码发出 GET 请求有关,而您实际上应该发出 HEAD 请求:

    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("HEAD");
    

    我不确定这是否能解决问题,但文档说

    在请求后对 HttpURLConnection 的 InputStream 或 OutputStream 调用 close() 方法可能会释放与此实例关联的网络资源

    GET 请求肯定会比HEAD 请求使用更多资源。除非严格要求 GET 请求,否则您应该避免它。如果您不确定服务器是否支持HEAD 请求,请先尝试HEAD,如果第一次尝试失败则回退到GET

    【讨论】:

    • 谢谢,我会试试的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    相关资源
    最近更新 更多