2012-08-08 15 views
7

मेरे एंड्रॉइड ऐप की सर्विस क्लास में एक आरईएसटी वेब सेवा पर कॉल करना NetworkOnMainThreadException बनाएं।एंड्रॉइड: किसी सेवा में नेटवर्क का उपयोग

मुझे समझ में आता है कि इस अपवाद को गतिविधि में क्यों उठाया गया है: नेटवर्क पर कुछ सिंक्रनाइज़ेशन करना बेहद खराब अभ्यास है, लेकिन मुझे सेवा कक्षा में वही त्रुटि देखने में आश्चर्य हुआ। तो मेरा सवाल है:

- इस विशिष्ट मामले में, क्या मुझे इस कॉल को अनुमति देने के लिए StrictMode.setThreadPolicy() का उपयोग करना चाहिए।

-या मैं एक AsyncTask का उपयोग करना चाहिए (और उन है कि यह पढ़ क्योंकि वे एक गतिविधि में इस त्रुटि का सामना करना पड़ा है, StrictMode का उपयोग नहीं करते इस त्रुटि को छुपाने के लिए, एक AsyncTask का उपयोग करें)? और उस मामले में, यहां क्या मुद्दा है? क्या गतिविधि के एक से अलग धागे पर सेवा नहीं है?

उत्तर

12

भले ही Serviceमुख्य थ्रेड में पृष्ठभूमि प्रसंस्करण के लिए लक्षित है।

documentation से एक छोटी बोली:

सावधानी: एक सेवाओं, आवेदन, जिसमें यह घोषित किया जाता है के समान प्रक्रिया में और है कि आवेदन की मुख्य थ्रेड में चलाता है डिफ़ॉल्ट रूप से। इसलिए, यदि आपकी सेवा गहन या अवरुद्ध संचालन करती है, जबकि उपयोगकर्ता एक ही एप्लिकेशन से किसी गतिविधि के साथ इंटरैक्ट करता है, तो सेवा गतिविधि प्रदर्शन को धीमा कर देगी। एप्लिकेशन प्रदर्शन को प्रभावित करने से बचने के लिए, आपको सेवा के अंदर एक नया धागा शुरू करना चाहिए।

'पृष्ठभूमि प्रसंस्करण' का अर्थ है कि सेवा में कोई उपयोगकर्ता इंटरफ़ेस नहीं है, यह तब भी चलाया जा सकता है जब उपयोगकर्ता सीधे एप्लिकेशन के साथ सहभागिता नहीं कर रहा हो। लेकिन सभी पृष्ठभूमि प्रसंस्करण अभी भी मुख्य धागे में डिफ़ॉल्ट रूप से होता है।

तो, इसे कैसे हल करें और अपवाद से छुटकारा पाएं? जैसा कि प्रलेखन सुझाव देता है कि आपको पृष्ठभूमि थ्रेड का उपयोग करना होगा। आपकी सेवा में आप AsyncTask का उपयोग कर सकते हैं या सीधे धागे बना सकते हैं। लेकिन मुझे लगता है कि IntentService आपके मामले में सबसे उपयुक्त हो सकता है। IntentService पृष्ठभूमि थ्रेड में अनुरोधों को संसाधित करता है (इसलिए वह सेवा है जिसकी आप खोज कर रहे थे)।

+0

आपके उत्तर के लिए धन्यवाद, इसलिए मुझे यही संदेह है। मुझे लगता है कि चूंकि वे पृष्ठभूमि कार्यों के लिए उपयोग किए जाते हैं, इसलिए सेवा डिफ़ॉल्ट रूप से किसी अन्य धागे पर होगी, लेकिन ऐसा नहीं है। असल में मैं 'मीडियाप्लेयर' पर कॉल प्रबंधित करने के लिए उस सेवा का उपयोग करता हूं, इसलिए इसे मुख्य थ्रेड पर रखना ऐसा नहीं लगता है क्योंकि 'readyAsync()' मुझे अपने व्यवहार को सुंदर ढंग से प्रबंधित करने की अनुमति देता है। स्ट्रीमिंग यूआरएल प्राप्त करने के लिए मुझे 'AsyncTask' का उपयोग करने के लिए बस अपनी सेवा को संशोधित करना होगा। – Teovald

+1

अच्छा उत्तर, यहां तक ​​कि सामग्रियां भी उपलब्ध हैं जो आपको यह समझने में सहायता करेंगी कि नेटवर्क का कुशलतापूर्वक उपयोग कैसे किया जाए, यह सुनिश्चित करने के लिए कि आपका ऐप अनुकूलित है। http://developer.att.com/developer/forward.jsp?passedItemId=7200042 –

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