2012-10-19 12 views
10

मैं एक Android एप्लिकेशन है एक टीसीपी (Node.js में लिखा) एक टीसीपी सर्वर से कनेक्शनएंड्रॉयड TCP कनेक्शन सबसे अच्छा अभ्यास

मेरे Android टीसीपी ग्राहक काम कर रहा है एक संदेशों आगे और पीछे भेज सकते हैं की आवश्यकता है पर काम कर रहा हूँ।

मेरे spesific सवाल है:

  1. सबसे अच्छा तरीका है एंड्रॉयड में एक सर्वर के लिए एक TCP कनेक्शन को संभालने के लिए क्या है?
  2. कनेक्शन को कैसे बनाए रखें (ऑनस्ट्राय() आदि पर कनेक्शन को ठीक से बंद करें)?

    @Override 
    protected Void doInBackground(Void... params) { 
         try { 
          Log.d("TCP_MESSAGE", "Connecting..."); 
    
           socket = new Socket(MY_LOCAL_IP, 8080); 
           dataOutput = new DataOutputStream(socket.getOutputStream()); 
    
           inputstream = new InputStreamReader(socket.getInputStream()); 
           input = new BufferedReader(inputstream); 
    
    
          while (!canceled) { 
           String message = input.readLine(); 
           handleMessage(message); 
          } 
    
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
        return null; 
    } 
    
    :
  3. कोई bether रास्ता तो एक AsyncTask का उपयोग कर

मैं इस तरह एक AsyncTask में मेरी सॉकेट कनेक्शन है (एक सामान्य थ्रेड वर्ग है, जो एंड्रॉयड 4.0 में अनुमति नहीं है को छोड़कर) है

कारण है कि मेरे पास AsyncTask में कनेक्शन है क्योंकि मैं एंड्रॉइड 4.0 का उपयोग कर रहा हूं और नियमित थ्रेड में नेटवर्क कोड रखने की अनुमति नहीं है।

+2

क्या आप कह रहे हैं कि 4.0 में थ्रेड का उपयोग करने की अनुमति नहीं है? वह सत्य नहीं है। लेकिन फिर भी मेरा जवाब नीचे देखें। –

+0

आप 4.0 में थ्रेड होने के बारे में गलत हैं। आप ** MAIN ** थ्रेड में नेटवर्क कोड नहीं कर सकते हैं। – m0skit0

+0

ओके। मुझे एक अपवाद मिला जब मैंने सामान्य थ्रेड का उपयोग किया (और अन्य धागे पाए जो एक ही समस्या को तेज करते थे)। लेकिन मैंने सोचा कि यह थोड़ा अजीब था, मुझे लगता है कि आपके पास सही है। – Emil

उत्तर

6

एक सेवा के कनेक्शन होना चाहिए। यदि आपको अपना ऐप नहीं चल रहा है, तो आपको कनेक्शन रखना होगा, तो आपको इसे अग्रभूमि सेवा बनाना चाहिए। यदि आप इसे अग्रभूमि सेवा नहीं बनाते हैं, तो सुनिश्चित करें कि इसे अपनी गतिविधियों से सेवा को जीवित रखने के लिए बाध्य करें।

यह भी न भूलें कि सेवा मुख्य (यूआई) थ्रेड पर भी चलती है ताकि आपको संचार को संभालने के लिए अभी भी एक अलग थ्रेड की आवश्यकता हो।

यदि आपके पास केवल एक गतिविधि है और कॉन्फ़िगरेशन परिवर्तनों के कारण बस पुनरारंभ करना चाहते हैं, तो आप कॉन्फ़िगरेशन परिवर्तनों को स्वयं संभाल सकते हैं, गैर-UI टुकड़े के स्वामित्व वाले कनेक्शन को रख सकते हैं, याRetainNonConfigurationInstance का उपयोग कर अपने आप से कनेक्शन पास कर सकते हैं ()/getLastNon कॉन्फ़िगरेशन इंस्टेंस() (हालांकि यह टुकड़ों का उपयोग करने के पक्ष में बहिष्कृत है)।

+0

मुझे नहीं पता कि आप सेवा के बारे में क्यों बात कर रहे हैं। उन्होंने कहीं भी सेवा का जिक्र नहीं किया, या तो ऐप मरने पर कनेक्शन बनाए रखने के बारे में बात की। असल में वह कहता है कि वह चाहता है कि कनेक्शन 'ऑनडेस्ट्रॉय()' कॉलबैक में नष्ट हो गया ... – m0skit0

+4

नहीं, लेकिन उसने कनेक्शन रखने का सबसे अच्छा तरीका पूछा, और यह एक सेवा है यदि आप गतिविधियों के बीच कनेक्शन रखना चाहते हैं और विन्यास में परिवर्तन। –

+1

उस स्थिति में कनेक्शन रखने का सबसे अच्छा तरीका ** – m0skit0

2

एंड्रॉइड में किसी सर्वर से एक टीसीपी कनेक्शन को संभालने का सबसे अच्छा तरीका क्या है?

यह आपके ऐप की जटिलता पर निर्भर करता है, और आप इसके साथ क्या करना चाहते हैं। एंड्रॉइड नेटवर्किंग के लिए कोई विशिष्टता नहीं है।

कनेक्शन को बनाए रखने के लिए कैसे करें (कनेक्शन को ऑनडस्ट्राय() आदि पर ठीक से बंद करें)?

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

कोई bether रास्ता तो एक AsyncTask का उपयोग कर (एक सामान्य थ्रेड वर्ग है, जो एंड्रॉयड 4.0 में अनुमति नहीं है सिवाय)

आप एंड्रॉयड 4.0 (API14) में सामान्य जावा धागे का उपयोग कर सकते है। आपको भ्रम हो सकता है: एंड्रॉइड में अनुमति नहीं है मुख्य थ्रेड में 0 कोड (यूआईटीएचएड) में नेटवर्क कोड है।

+0

हां, मैं एंड्रॉइड 4.0 में धागे के बारे में गलत था। मैं ऑनस्ट्रोय() पर अपना कनेक्शन बंद करता हूं, लेकिन थ्रेड बंद करता हूं, मैं हमेशा इतना आसान नहीं हूं। लेकिन आपके उत्तर के लिए धन्यवाद। – Emil

+1

ऐसा क्यों? जब वे 'रन() 'से बाहर निकलते हैं तो थ्रेड बस मर जाते हैं। – m0skit0

+0

डाउनवोट के लिए स्पष्टीकरण? – m0skit0

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