2017-01-29 10 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

私はあなたが本当にHEADリクエストを行う必要がある場合、これはGET要求を行うコードに関連するかもしれないと思う:私はこの問題を修正するかどうかわからない

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

が、ドキュメントたとえば、

リクエスト後にHttpURLConnectionのInputStreamまたはOutputStreamでclose()メソッドを呼び出すと、このインスタンスに関連付けられたネットワークリソースが解放される可能性があります。

GETリクエストは、HEADリクエストよりも多くのリソースを使用します。 GETリクエストが厳密に要求されている場合を除き、それを避ける必要があります。サーバーがHEADリクエストをサポートしているかどうかわからない場合は、最初にHEADを試し、最初の試行が失敗した場合はGETにフォールバックしてください。

+0

ありがとうございます。 –

1

サイズがゼロの場合は、接続を切断する必要があります。 sizeが0より大きい場合、接続は入力ストリームを処理する必要があります。以下のコードを試してください。

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

近所はありません。私もこれを過去に試みました。 –

関連する問題