मुझे लगता है कि जब तक एप्लिकेशन चल रहा है एक नियमित आधार पर एक सर्वर के साथ संचार एक Android एप्लिकेशन का निर्माण कर रहा हूँ का उपयोग कर एक सर्वर के साथ संवाद करने के लिए।एंड्रॉयड ग्राहक के लिए सबसे अच्छा अभ्यास धागे
मैं जब अनुप्रयोग शुरू होता है, तो मैं संदेशों ReceiverThread
कहा जाता प्राप्त करने के लिए एक अलग thread
है सर्वर से कनेक्शन की प्रक्रिया शुरू करके ऐसा करते हैं, इस thread
socket
से संदेश पढ़ता है, यह विश्लेषण करती है, और उचित हिस्सा को फ़ॉरवर्ड आवेदन के एक पाश में
यह thread
रन, पढ़ने जब तक नए डेटा आता है जो कुछ भी यह read()
आदेश पर ब्लॉक पढ़ सकते हैं और उसके बाद के लिए है, तो यह खर्च करता है इसमें से अधिकांश समय ब्लॉक किया गया है।
मैं एक अलग धागे के माध्यम से संदेश भेजने संभाल, SenderThread
कहा जाता है। मैं किस बारे में सोच रहा हूं: क्या मुझे एक ही फैशन में SenderThread
बनाना चाहिए? मतलब मैं किसी न किसी रूप, इस सूत्र के लिए एक कतार बनाए रखना चाहिए यह कतार में सभी संदेशों को भेजने के लिए और तब तक नए संदेश कतार में प्रवेश अवरुद्ध करने देते, या मैं बस हर बार संदेश भेजे जाने की आवश्यकता धागा का एक नया उदाहरण शुरू कर देना चाहिए , इसे संदेश भेज दें और फिर "मर जाएं"? मैं पहले दृष्टिकोण की तरफ झुका रहा हूं, लेकिन मुझे नहीं पता कि प्रदर्शन की अवधि में क्या वास्तव में बेहतर है (स्मृति में अवरुद्ध थ्रेड को बनाम नए धागे को शुरू करने के विरुद्ध), और कोड शुद्धता के मामले में।
चूंकि मेरी सभी गतिविधियों को संदेश भेजने और प्राप्त करने में सक्षम होने की आवश्यकता है, इसलिए मैं अपने Application
कक्षा में दोनों धागे का संदर्भ रख रहा हूं, क्या यह एक स्वीकार्य दृष्टिकोण है या मुझे इसे अलग-अलग कार्यान्वित करना चाहिए?
एक समस्या यह है कि मैं इस के साथ सामना करना पड़ा है कि मैं वास्तव ReceiverThread के दो उदाहरणों है कभी कभी अगर मैं अपने आवेदन को बंद करने और इसे फिर से चलाने है, इसलिए मैं दो बार कुछ संदेश मिलता है।
मैं अनुमान लगा रहा हूँ कि इस वजह से अपने आवेदन वास्तव में बंद नहीं किया और पिछले धागा अभी भी सक्रिय था (read()
संचालन पर अवरुद्ध), और जब मैं आवेदन फिर से खोला एक नया धागा प्रारंभ किया गया था, लेकिन दोनों से जुड़े थे सर्वर इसलिए सर्वर ने दोनों को संदेश भेजा। इस समस्या को हल करने के तरीके, या इसे पूरी तरह व्यवस्थित करने के तरीके पर कोई सुझाव, तो यह सही होगा?
मैं इन सवालों को देख कोशिश की, लेकिन मेरा पहला प्रश्न के लिए कुछ परस्पर विरोधी उदाहरण मिल गया है, और कुछ भी नहीं है कि पर्याप्त रूप से उपयोगी है और मेरे दूसरे प्रश्न पर लागू होता है ...
में मदद करता है "बंद" ऐप वास्तव में इसे मार नहीं रहा है। यह सिर्फ चल रहा है और विशेष रूप से धागे किसी भी तरह से – zapl
@zapl को रोक नहीं है हाँ, मुझे इसकी जानकारी है, यह मेरी समस्या है। सवाल यह है कि धागे को विश्वसनीय रूप से कैसे रोकें? या इस समग्र समस्या को इस तरीके से कैसे बचाया जा सकता है? – Bob
यह वास्तव में मुश्किल है। 'थ्रेड # इंटरप्ट() '(+' सॉकेट # क्लोज़() ') का उपयोग इसे रोकने के लिए किया जा सकता है लेकिन कठिन हिस्सा यह ट्रैक रखना है कि एप्लिकेशन चल रहा है या पृष्ठभूमि में बस निष्क्रिय है या नहीं। उदाहरण के लिए प्रत्येक गतिविधि 'ऑनस्टार्ट' पर 'ऑनस्टार्ट' से कर सकती है। – zapl