2012-07-27 14 views
5

लॉन्च करने के लिए ब्रॉडकास्ट रिसीवर का उपयोग करके मैं पुश अधिसूचना प्राप्त करने पर यूआई की स्थिति को अपडेट करने का प्रयास कर रहा हूं। ऐसा करने के लिए, मुझे AsyncTask शुरू करना होगा जो कुछ नेटवर्क ऑपरेशंस करता है और फिर परिणाम के आधार पर यूआई अपडेट करता है।एक AsyncTask

BroadcastReceiver के लिए दस्तावेज़, एक रिसीवर के भीतर अतुल्यकालिक ऑपरेशनों को करने के मुताबिक असुरक्षित है क्योंकि यह क्रियान्वित करने की प्रक्रिया के रूप में जल्द onReceive() रिटर्न के रूप में मारा जा सकता है, यह मानते हुए कोई अन्य "एप्लिकेशन घटकों" इस प्रक्रिया में हो रहा है।

BroadcastReceiver अपनी प्रक्रिया में चल रहा है, या एक ही प्रक्रिया में शामिल गतिविधि के रूप में? चूंकि मुझे अपडेट करने के लिए यूआई होने तक ही कार्य पूरा होने की परवाह है, इसलिए गतिविधि बंद होने पर AsyncTask मरने से मुझे चिंता नहीं है। ब्रॉडकास्ट रिसीवर मानते हुए गतिविधि के समान प्रक्रिया में है, क्या यह रिसीवर के भीतर से किए गए कार्य को लॉन्च करने के लिए ठीक/सुरक्षित बनाता है?

संपादित करें:

स्पष्ट करने के लिए, मैं गतिविधि के onResume() में रिसीवर को पंजीकृत कर रहा हूँ और यह onPause() पंजीकरण रद्द, तो यह केवल उद्देश्य प्राप्त किया जाना चाहिए जब गतिविधि पहले से ही सक्रिय है।

+0

एक 'BroadcastReceiver के बजाय Service' का उपयोग नहीं क्यों अगर इसके असुरक्षित? यह वही काम पूरा करेगा, लेकिन इस मुद्दे के बिना आप बात करते हैं। – Andy

+0

@Andy मैं समझता हूँ कि एक 'Service' का उपयोग कर सभी परिस्थितियों में सुरक्षित हो जाएगा, लेकिन मैं यह निर्धारित करने के लिए कि क्या यह इस विशेष मामले में वास्तव में आवश्यक है कोशिश कर रहा हूँ। – jnackman

+1

खैर यह है अगर आप इसके बारे में सोचते हैं। सेवा अतुल्यकालिक संचालन को चलाने के लिए एकदम सही हैं। इसलिए क्यों एक ही सीमा मौजूद नहीं है। BroadcastReceivers मुख्य रूप से की तरह है जब कुछ सिस्टम में होता है, वास्तव में नहीं है जब डेटा शुद्ध के माध्यम से अद्यतन किया जा रहा है अन्य बातों के लिए किया जाता है। इसलिए "प्रसारण"। जबकि एक 'Service' कि यह क्या है, एक सेवा आप पक्ष यह है कि उपयोगकर्ता के बारे में पता करने की जरूरत नहीं है पर चल रहे हैं। उम्मीद है कि समझ में आता है। – Andy

उत्तर

5

ब्रॉडकास्ट रिसीवर अपनी प्रक्रिया पर नहीं चल रहा है, यह यूआई थ्रेड पर चल रहा है।

आपकी प्रक्रिया को तब ही मार दिया जाएगा जब आपके ऐप में कोई अन्य गतिविधि या सेवा नहीं चल रही हो।

यदि आपका प्रसारण रिसीवर एक आंतरिक वर्ग का उदाहरण है और केवल आपकी गतिविधि सक्रिय होने पर ही प्राप्त होता है, तो आपकी प्रक्रिया को रिसीव विधि रिटर्न के बाद नहीं मारा जाएगा।

+0

[आधिकारिक दस्तावेज के लिए लिंक] (http://developer.android.com/reference/android/content/BroadcastReceiver.html#ProcessLifecycle) – renadeen

0

मैं प्रसारण रिसीवर से startActivity(intent) कर रहा हूं। बस इतना ही। इरादे के अंदर मैं आपके द्वारा की जाने वाली ईवेंट जानकारी प्रदान करता हूं, आप बस बंडल में पैरामीटर सेट कर सकते हैं। इसके बाद आप गतिविधि onStart() या onCreate() जो भी कॉल हो जाते हैं, के अंदर इसकी जांच कर सकते हैं। यदि ध्वज वहां है, तो Activity से AsyncTask पर लातें।

सेवा-गतिविधि से सभी बाध्यकारी और संचार सीमाओं के साथ, किसी भी सेवा का उपयोग करने की आवश्यकता नहीं है।

याद रखें कि आप startActivityForResult() भी कर सकते हैं। मुझे लगता है कि आप प्रसारण रिसीवर के अंदर पास और आगे छोड़कर कुछ भी नहीं करना चाहते हैं।

बीटीडब्ल्यू, गतिविधियों को यूआई की आवश्यकता नहीं है। बेकार गतिविधियों हो सकती है।

+0

आप उल्लेख किया है - _ ... गतिविधियों UI's_ की आवश्यकता नहीं है - मैं तो सेवा का उपयोग करने की सलाह देते हैं उसे ... मैंने सोचा था कि गतिविधियों यूआई के लिए उपयोग किया जाता है, और पृष्ठभूमि कार्यों के लिए सेवाएं। –

1

यदि आपके AsyncTask के अंदर, आपको एक संदर्भ की आवश्यकता है, तो मुझे लगता है कि एक सेवा बेहतर है। यदि नहीं, AsyncTask का उपयोग करने में कोई समस्या नहीं है।

1

हनीकॉम (API11) से पहले, आपको एक सेवा का उपयोग करना पड़ा।

के बाद से Honeycomb (API11), तो आप उपयोग कर सकते हैं goAsync():

यह को onReceive (संदर्भ, आशय) में एक आवेदन से कहा जा सकता है यह है कि समारोह से लौटने के बाद प्रसारण सक्रिय रखने के लिए अनुमति देते हैं ।यह अपेक्षाकृत प्रसारण (10s के भीतर इसे पूरा करने) के लिए उत्तरदायी होने की उम्मीद नहीं बदलता है, लेकिन एक और धागा को इस पर से संबंधित काम ले जाने के लिए डिस्क आईओ की वजह से मुख्य यूआई धागा glitching से बचने के लिए अनुमति नहीं है कार्यान्वयन।

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