2012-06-15 12 views
22

Poniższy kod zasadniczo działa zgodnie z oczekiwaniami. Jednak, aby być paranoikiem, zastanawiałem się, aby uniknąć wycieku zasobów,Czy muszę zadzwonić HttpURLConnection.disconnect po zakończeniu korzystania z niego

  1. Czy muszę zadzwonić HttpURLConnection.disconnect, po wykończenie jego użycie?
  2. Czy muszę zadzwonić pod numer InputStream.close?
  3. Czy muszę zadzwonić pod numer InputStreamReader.close?
  4. Czy muszę mieć następujący 2 wiersz kodu: httpUrlConnection.setDoInput(true) i httpUrlConnection.setDoOutput(false), tuż po zbudowaniu httpUrlConnection?

Powód, dla którego tak pytam, to większość przykładów, które widziałem, nie robię takich porządków. http://www.exampledepot.com/egs/java.net/post.html i http://www.vogella.com/articles/AndroidNetworking/article.html. Chcę tylko upewnić się, że te przykłady są poprawne.


public static String getResponseBodyAsString(String request) { 
    BufferedReader bufferedReader = null; 
    try { 
     URL url = new URL(request); 
     HttpURLConnection httpUrlConnection = (HttpURLConnection)url.openConnection(); 
     InputStream inputStream = httpUrlConnection.getInputStream(); 
     bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 

     int charRead = 0; 
     char[] buffer = new char[1024]; 
     StringBuffer stringBuffer = new StringBuffer(); 
     while ((charRead = bufferedReader.read(buffer)) > 0) { 
      stringBuffer.append(buffer, 0, charRead); 
     } 
     return stringBuffer.toString(); 
    } catch (MalformedURLException e) { 
     Log.e(TAG, "", e); 
    } catch (IOException e) { 
     Log.e(TAG, "", e); 
    } finally { 
     close(bufferedReader); 
    } 
    return null; 
} 

private static void close(Reader reader) { 
    if (reader != null) { 
     try { 
      reader.close(); 
     } catch (IOException exp) { 
      Log.e(TAG, "", exp); 
     } 
    } 
} 

Odpowiedz

22

Tak trzeba zamknąć InputStream pierwszy i blisko httpconnection obok. Zgodnie z javadoc.

Każda instancja HttpURLConnection jest używana do utworzenia pojedynczego żądania, ale podstawowe połączenie sieciowe z serwerem HTTP może być przezroczyście udostępniane innym instancjom. Wywołanie metod close() w obiekcie InputStream lub OutputStream obiektu HttpURLConnection po żądaniu może zwolnić zasoby sieciowe powiązane z tą instancją, ale nie ma wpływu na żadne wspólne połączenie trwałe. Wywołanie metody disconnect() może spowodować zamknięcie podstawowego gniazda, jeśli połączenie trwałe jest w tym czasie bezczynne.

Następne dwa pytania odpowiadają na pytanie o cel połączenia. Przeczytaj to link, aby uzyskać więcej informacji.

+0

Dzięki. Czy sądzisz, że na powyższych dwóch linkach do tutoriala są błędy, ponieważ nie powodują one rozłączenia? Czy może czegoś brakuje? –

+2

Nie mówię, że to pomyłka. Ale rozłączenie jest skrajnym przypadkiem (operacje zamykania gniazd są kosztowne), chyba że naprawdę chcesz, bym tego nie zrobił. stream.close() zwalnia większość zasobów sieciowych i powinno wystarczyć. Ponownie, jeśli twoje wymagania są w porządku, aby utworzyć gniazdo za każdym razem, nie ma nic złego w wywoływaniu rozłączenia. – kosa

+0

Będę często wysyłać prośby do prawie tego samego serwera, a przeciek pamięci to moja jedyna troska. Jeśli dobrze rozumiem dokumentację, nie ma potrzeby wywoływania rozłączenia w moim przypadku. –

0

Uważam, że wymaganie wywołania metody setDoInput() lub setDoOutput() polega na upewnieniu się, że są one wywoływane, zanim cokolwiek zostanie zapisane lub odczytane ze strumienia w połączeniu. Poza tym nie jestem pewien, czy ma to znaczenie, gdy te metody są wywoływane.

Powiązane problemy