2012-06-15 20 views
22

निम्न कोड मूल रूप से अपेक्षा के अनुसार काम करता है। हालांकि, पागल हो सकता है, मैं सोच रहा था, संसाधन रिसाव से बचने के लिए,क्या मुझे इसका उपयोग करने के बाद HttpURLConnection.disconnect को कॉल करने की आवश्यकता है

  1. मैं, HttpURLConnection.disconnect कॉल करने के लिए खत्म करने के बाद इसके उपयोग की आवश्यकता है?
  2. क्या मुझे InputStream.close पर कॉल करने की आवश्यकता है?
  3. क्या मुझे InputStreamReader.close पर कॉल करने की आवश्यकता है?
  4. क्या मुझे निम्नलिखित 2 लाइन कोड की आवश्यकता है: httpUrlConnection.setDoInput(true) और httpUrlConnection.setDoOutput(false), httpUrlConnection के निर्माण के ठीक बाद?

कारण मैं पूछता हूं, उदाहरण के अधिकांश उदाहरण मैंने देखा है कि इस तरह के सफाई नहीं करते हैं। http://www.exampledepot.com/egs/java.net/post.html और http://www.vogella.com/articles/AndroidNetworking/article.html। मैं बस यह सुनिश्चित करना चाहता हूं कि वे उदाहरण भी सही हैं।


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); 
     } 
    } 
} 

उत्तर

22

हाँ आप पहली बार InputStream को बंद करने और करीब httpconnection अगले करने के लिए की जरूरत है। javadoc के अनुसार।

प्रत्येक HttpURLConnection इंस्टेंस का उपयोग एक अनुरोध करने के लिए किया जाता है लेकिन HTTP सर्वर के अंतर्निहित नेटवर्क कनेक्शन को अन्य मामलों द्वारा पारदर्शी रूप से साझा किया जा सकता है। अनुरोध के बाद एक HttpURLConnection के इनपुटस्ट्रीम या आउटपुटस्ट्रीम पर क्लोज़() विधियों को कॉल करना इस उदाहरण से जुड़े नेटवर्क संसाधनों को मुक्त कर सकता है लेकिन किसी भी साझा लगातार कनेक्शन पर इसका कोई प्रभाव नहीं पड़ता है। डिस्कनेक्ट() विधि को कॉल करना अंतर्निहित सॉकेट को बंद कर सकता है यदि उस समय लगातार कनेक्शन निष्क्रिय हो जाता है।

अगले दो प्रश्न उत्तर आपके कनेक्शन के उद्देश्य पर निर्भर करते हैं। अधिक जानकारी के लिए यह link पढ़ें।

+0

धन्यवाद। क्या आपको लगता है कि उपर्युक्त दो ट्यूटोरियल लिंक पर गलतियां हैं क्योंकि वे डिस्कनेक्ट नहीं करते हैं? या क्या मैं कुछ न कुछ भूल रहा हूं? –

+2

मुझे नहीं लगता कि यह एक गलती है। लेकिन, डिस्कनेक्ट चरम मामला है (सॉकेट क्लोज़ ओपन ऑपरेशंस महंगे हैं), जब तक कि आप वास्तव में नहीं चाहते कि मैं इसके लिए नहीं जाऊंगा। stream.close() अधिकांश नेटवर्क संसाधनों को रिलीज़ करता है और पर्याप्त होना चाहिए। दोबारा, यदि आपकी आवश्यकता हर समय सॉकेट बनाने के लिए ठीक है, तो डिस्कनेक्ट करने में कुछ भी गलत नहीं है। – kosa

+0

मैं लगभग उसी सर्वर पर लगातार अनुरोध करना जारी रखूंगा, और स्मृति रिसाव मेरी एकमात्र चिंता है। अगर मैं दस्तावेज़ीकरण को सही ढंग से समझता हूं, तो मेरे मामले में डिस्कनेक्ट करने की आवश्यकता नहीं है। –

0

मुझे विश्वास है कि setDoInput() या setDoOutput() को कॉल करने की आवश्यकता को सुनिश्चित करना है कि कनेक्शन पर स्ट्रीम से कुछ भी लिखा या पढ़ने से पहले उन्हें बुलाया जाता है। इसके अलावा, मुझे यकीन नहीं है कि उन तरीकों को कब कहा जाता है।

संबंधित मुद्दे

 संबंधित मुद्दे