2012-04-04 14 views
6

मेरे एप्लिकेशन में कुछ गतिविधियां हैं जो पहले मैं एक सॉकेट को अन्य गतिविधियों पर सर्वर के साथ संवाद करने के लिए जोड़ती हूं। यह सॉकेट एक कार्यकर्ता थ्रेड में चलता है।एप्लिकेशन को खत्म करते समय सॉकेट बंद करें

मेरा प्रश्न है: एप्लिकेशन चालू होने पर मैं इस सॉकेट को कहां बंद कर सकता हूं? उदाहरण के लिए बैक बटन का उपयोग करना ...

मैंने सोचा कि पिछली गतिविधि के onDestroy() में सॉकेट बंद करें लेकिन इस गतिविधि को रनटाइम पर सिस्टम द्वारा नष्ट किया जा सकता है और एप्लिकेशन चालू होने पर भी सॉकेट बंद कर सकता है। मुझे यह नहीं चाहिए।

मेरे run() धागा गर्तिका कनेक्शन से निपटने में विधि की तरह है:

public void run() { 
    if (this.bliveclient.isConnected()){  
     try { 
      //... 
      while (running) { 
       //waiting for input data and do something... 
      } 
     } 
     catch (IOException ex) { 
      //handle exception 
     } 
     finally{ 
      try { 
       mySocket.close(); 
      } catch (IOException ex) { 
       //handle exception 
      } 
     } 
    } 

लेकिन finally ब्लॉक कभी नहीं कहा जाता है।

क्या कोई मुझे कुछ संकेत दे सकता है?

+0

आप कभी भी 'रनिंग' नहीं रोकते हैं या धागा मारे जाते हैं। कई क्रियाकलापों द्वारा आवश्यक नेटवर्क हैंडलिंग एक सेवा में स्थानांतरित करने के लिए एक अच्छी जगह की तरह लगता है। – zapl

+0

@zapl, टीसीपी कनेक्शन ठीक काम कर रहा है। मैं डेटा को सही तरीके से प्राप्त और भेज सकता हूं ... मेरा एकमात्र मुद्दा सॉकेट बंद कर रहा है, क्योंकि सर्वर को भी इस सॉकेट को बंद करने की आवश्यकता है। – amp

उत्तर

4

finally ब्लॉक कभी निष्पादित नहीं किया जाता है क्योंकि रन लूप कभी पूरा नहीं होता है। कुछ बिंदु पर एंड्रॉइड सिर्फ प्रक्रिया को मारता है, जो वीएम को मारता है और सबकुछ दूर चला जाता है।

यदि आपके पास कोई ऐसा एप्लिकेशन है जिसमें केवल गतिविधियां हैं और आप एक अलग थ्रेड में नेटवर्क I/O कर रहे हैं तो थ्रेड को बंद करने के बारे में जानने का कोई तरीका नहीं है क्योंकि "एप्लिकेशन" कभी समाप्त नहीं होता है " । आपको यह परिभाषित करने की आवश्यकता है कि एप्लिकेशन "समाप्त" कैसे होता है।

इसे बेहतर तरीके से सेवा में रखना है, क्योंकि अगर एंड्रॉइड प्रक्रिया को मारना चाहता है तो यह पहले सेवा में डेस्ट्रॉय() पर कॉल करेगा जो आपको अपने धागे को ठीक से बंद करने का मौका देगा।

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