मैं एक ऐप लिख रहा हूं जो लगातार डिवाइस के सेंसर को चुनाव करता है और हर बार फाइल को कुछ आंकड़े लिखना चाहिए। यह एक बार एक बार या एक मिनट में एक बार धीमा हो सकता है। क्या मुझे Handler's
postDelayed()
विधि का उपयोग करना चाहिए या बस इसे AlarmManager
के साथ शेड्यूल करना चाहिए?क्या मुझे अलार्ममेनगर या हैंडलर का उपयोग करना चाहिए?
उत्तर
मैं कहूंगा कि यह मतदान अंतराल पर निर्भर करता है। मुझे लगता है कि यह आपके मामले में काफी कम है (लगभग कुछ सेकेंड), इसलिए आपको हैंडलर रास्ता या टाइमर क्लास का उपयोग करके जाना चाहिए।
अलार्ममेनर एक उच्च स्तर की सेवा है और इसमें इस उपयोग के मामले को संभालने के लिए एक बड़ा ओवरहेड शामिल है। जब अलार्म ट्रिगर होता है, तो आपको इसे ब्रॉडकास्ट रिसीवर के साथ संभालना होगा। इसका मतलब यह है कि हर बार जब आप इनमें से किसी एक अलार्म को संभालते हैं, तो आपको उन सेंसर के लिए श्रोताओं को पंजीकृत करने की आवश्यकता होती है, जिनमें आप रुचि रखते हैं, जो बेहद अक्षम है।
यदि ऐप को स्टैंडबाय में काम करना चाहिए तो AlarmManager
। यदि नहीं तो Handler
।
AlarmManager
सीपीयू जगाएगा इसलिए यह बैटरी को और अधिक निकाल देगा, जबकि Handler
स्टैंडबाय पर काम नहीं करेगा।
फ़ोन कब नींद मोड में जाता है? मैं थोड़ी देर के लिए अपने ऐप का परीक्षण कर रहा हूं और डिवाइस स्टैंडबाय में जा रहा है कभी भी कोई मुद्दा नहीं रहा है। –
मुझे अभी और अधिक विस्तृत उत्तर मिला है: http://stackoverflow.com/a/5120225/538169 – pawelzieba
तय करें कि आपके डिजाइन नीचे दिए गए महत्वपूर्ण बिंदुओं पर आधारित:
AlarmManager: लाभ AlarmManager
साथ यह काम करता है कि भले ही डिवाइस (सीपीयू बंद है) गहरी नींद मोड में है है। जब अलार्म आग लगती है, तो यह BroadcastReceiver
और onReceive
में हिट करता है, यह जागने के लॉक को प्राप्त करता है (यदि आपने WAKEUP
RTC_WAKEUP
या ELAPSED_TIME_WAKEUP
जैसे अलार्म के प्रकारों का उपयोग किया है)। onReceive()
को खत्म करने के बाद यह जाग ताला जारी करता है।
लेकिन ज्यादातर बार यह मेरे लिए काम नहीं करता था। इसलिए मैंने onReceive()
में अपने स्वयं के जागने वाले ताले हासिल कर लिए हैं और यह सुनिश्चित करने के लिए अंत में उन्हें जारी किया है कि मुझे वास्तव में सीपीयू मिल जाए।
कारण यह काम नहीं करता है कि जब कई अनुप्रयोग एक साथ संसाधन का उपयोग करते हैं (जैसे जागने वाले ताले जो सिस्टम को निलंबित करने से रोकते हैं), तो फ्रेमवर्क उन अनुप्रयोगों में सीपीयू खपत फैलता है, हालांकि आवश्यक रूप से समान नहीं है। इसलिए, यदि यह महत्वपूर्ण है, तो जागने वाले ताले हासिल करना और सामान करना हमेशा बेहतर होता है।
टाइमर और हैंडलर: Handler
और टाइमर गहरी नींद मोड में काम नहीं करते काम अर्थ/runnable जब डिवाइस सो है अनुसूची के अनुसार नहीं चलेंगे। वे नींद में समय की गणना नहीं करते हैं जिसका मतलब है कि कार्य निष्पादित करने में देरी की गणना केवल सक्रिय मोड के दौरान की जाएगी। इसलिए, वास्तविक देरी देरी से दी जाएगी + समय-व्यतीत-गहरी नींद में।
इससे आपको Handler
और AlarmManager
के बीच भेदभाव करने में मदद करनी चाहिए। [source]
हालांकि यह अधिकतर एपीआई 23 के लिए काम करने पर सहमत है। यह एक नई रिलीज है।
मैं टाइमर प्रलेखन जाँच की है, इसका क्या मतलब है के लिए एक टाइमर एक डेमॉन धागे के रूप चलाने के लिए? क्या यह एक सेवा है? –