2017-01-29 20 views
2

У меня есть функция, которая получает размер файла на сервере. Я понимаю, что закрытие соединения может занять много времени, например, 10 секунд или более. Теперь у меня сложилась ситуация, что в эмуляторе Android он повесился вечно, но, начиная с того же приложения на реальном устройстве, он прошел нормально.URL-адрес Соединение иногда зависает

Может кто-нибудь объяснить это поведение или есть лучший способ закрыть соединение?

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

Я думаю, что это может быть связано с вашим кодом, сделать GET запрос, когда вы действительно должны сделать HEAD запрос:

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

Я не уверен, будет ли это исправить эту проблему, но документы скажем

Вызов методов close() в InputStream или OutputStream HttpURLConnection после запроса может освобождать сетевые ресурсы, связанные с этим экземпляром

и GET запрос обязательно будет использовать больше ресурсов, чем запрос HEAD. Если не требуется запрос GET, его следует избегать. Если вы не уверены, поддерживает ли сервер HEAD, сначала попробуйте HEAD и вернитесь к GET, если первая попытка не удалась.

+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; 
     } 
+0

Насколько я знаю, класс 'URLConnection' не имеет метода' close() '. –

+0

Вряд ли у него нет близкого расстояния. Я пробовал это и в прошлом. –