2012-12-30 13 views
8

मेरे पास एक एसिंक्टास्क है जो कुछ करता है, जब यह किया जाता है, तो मैं इसे प्रसारित करना चाहता हूं।asynctasks से प्रसारण भेजना

आमतौर पर मैं करता हूं: context.sendBroadcast(new Intent(MYINTENT)); हालांकि asynctask का कोई संदर्भ नहीं है। मैंने इस प्रश्न के कुछ जवाब देखे हैं जो एपिनक्टास्क में ऐप की गतिविधि के संदर्भ को संदर्भित करने का सुझाव देते हैं। लेकिन यदि उपयोगकर्ता स्क्रीन को घुमाता है तो वह संदर्भ खराब है। और संदर्भ को मैन्युअल रूप से बनाए रखना एक खराब समाधान है (एसिंक्टास्क बनाने वाली गतिविधि से बहुत अधिक आवश्यकता है, जिसे मैं नियंत्रित नहीं करता)। अब सवाल हैं:

1) एंड्रॉइड इस तरह क्यों स्थापित है? ब्रॉडकास्ट को अन्य संदर्भों के लिए पंजीकृत और प्रबंधित किए जाने पर प्रसारण भेजने के लिए मुझे संदर्भ की आवश्यकता क्यों है?

2) क्या इस समस्या का कोई अच्छा समाधान है? (अच्छा = asynctask बनाने की गतिविधि से जितना संभव हो सके, घूर्णन जीवित रहता है, आदि ..)।

+1

'Activity.getAplicationContext()' का उपयोग करके 'AsyncTasnk' पर एप्लासिशन संदर्भ पास करें। ऐप संदर्भ स्क्रीन रोटेशन से प्रभावित नहीं होगा जिसका अर्थ है कि इसके संदर्भ में संभावित रोटेशन के बाद भी वैध होगा। – Paul

+0

@ पॉल अच्छी तरह से तकनीकी समस्या हल करता है, धन्यवाद। अभी भी सोच रहा है कि मुझे ब्रॉडकास्ट भेजने के लिए संदर्भ की आवश्यकता क्यों है (एक डिजाइन स्टैंड पॉइंट से)। – Oren

उत्तर

16

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

आप अपने AndroidManifest.xml फ़ाइल में android:configChanges विशेषता सेट करके इसका विरोध कर सकते हैं लेकिन आपके मामले में इस समाधान की अनुशंसा नहीं की जाती है।

इस समस्या से निपटने का सही तरीका एप्लिकेशन गतिविधि को AsyncTask पर अपनी गतिविधि के बजाय पास करना है (ActivityContext से विरासत)। आप अपनी गतिविधि के उदाहरण से getApplicationContext() पर कॉल करके ऐसा कर सकते हैं। आपके अनुप्रयोग संदर्भ स्क्रीन रोटेशन और जीवन जैसे ईवेंट जारी रखेंगे जब तक कि सिस्टम ऐप को मारता न हो।

क्यों आप बुनियादी कार्य करने के लिए संदर्भ का एक उदाहरण की जरूरत के रूप में:

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

यह कैसे आधिकारिक दस्तावेज एक को परिभाषित करता है के रूप में Context। शायद कोई इसे बेहतर समझा सकता है लेकिन मेरे लिए यह परिभाषा पर्याप्त है।

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