वेक लॉक का इस्तेमाल करने से, डिवाइस की परफ़ॉर्मेंस पर असर पड़ सकता है. अगर आपको वेक लॉक का इस्तेमाल करना है, तो यह ज़रूरी है कि इसे सही तरीके से इस्तेमाल किया जाए. इस दस्तावेज़ में, वेक लॉक से जुड़ी आम समस्याओं से बचने के कुछ सबसे सही तरीके बताए गए हैं.
वेक लॉक का नाम सही तरीके से रखें
हमारा सुझाव है कि वेकलॉक टैग में, अपने पैकेज, क्लास या तरीके का नाम शामिल करें. इससे, अगर कोई गड़बड़ी होती है, तो सोर्स कोड में उस जगह को ढूंढना आसान हो जाता है जहां वेक लॉक बनाया गया था. यहां कुछ अन्य सुझाव दिए गए हैं:
- नाम में, व्यक्तिगत पहचान से जुड़ी कोई भी जानकारी (पीआईआई) शामिल न करें. जैसे, ईमेल पता. अगर डिवाइस को वेक लॉक टैग में पीआईआई मिलती है, तो वह आपके बताए गए टैग के बजाय
_UNKNOWNलॉग करता है. - क्लास या तरीके का नाम, प्रोग्राम के ज़रिए न लें. उदाहरण के लिए,
getName()को कॉल करके. अगर प्रोग्राम के ज़रिए नाम लेने की कोशिश की जाती है, तो Proguard जैसे टूल की मदद से, नाम को छिपाया जा सकता है. इसके बजाय, हार्ड-कोडेड स्ट्रिंग का इस्तेमाल करें. - वेक लॉक टैग में, काउंटर या यूनीक आइडेंटिफ़ायर न जोड़ें. वेक लॉक बनाने वाले कोड को हर बार एक ही टैग का इस्तेमाल करना चाहिए. इस तरीके से, सिस्टम हर तरीके के वेक लॉक के इस्तेमाल को इकट्ठा कर पाता है.
पक्का करें कि आपका ऐप्लिकेशन फ़ोरग्राउंड में दिखे
वेक लॉक चालू रहने के दौरान, डिवाइस पावर का इस्तेमाल करता है. डिवाइस के उपयोगकर्ता को इस बारे में पता होना चाहिए. इसलिए, अगर वेक लॉक का इस्तेमाल किया जा रहा है, तो उपयोगकर्ता को कोई सूचना दिखानी चाहिए. इसका मतलब है कि आपको फ़ोरग्राउंड सेवा में वेकलॉक लेना और उसे होल्ड करना चाहिए. फ़ोरग्राउंड सेवाओं के लिए, सूचना दिखाना ज़रूरी है.
अगर फ़ोरग्राउंड सेवा, आपके ऐप्लिकेशन के लिए सही विकल्प नहीं है, तो शायद आपको वेक लॉक का इस्तेमाल भी नहीं करना चाहिए. जब आपका ऐप्लिकेशन फ़ोरग्राउंड में न हो, तब काम करने के अन्य तरीकों के लिए, डिवाइस को चालू रखने के लिए सही एपीआई चुनना लेख पढ़ें.
लॉजिक को आसान रखें
पक्का करें कि वेक लॉक पाने और रिलीज़ करने का लॉजिक जितना हो सके उतना आसान हो. जब आपका वेक लॉक लॉजिक, जटिल स्टेट मशीन, टाइम आउट, एक्ज़ीक्यूटर पूल या कॉलबैक इवेंट से जुड़ा होता है, तो उस लॉजिक में कोई भी मामूली गड़बड़ी होने पर, वेक लॉक को उम्मीद से ज़्यादा समय तक होल्ड किया जा सकता है. इन गड़बड़ियों का पता लगाना और इन्हें ठीक करना मुश्किल होता है.
देखें कि वेक लॉक हमेशा रिलीज़ किया जाता है या नहीं
अगर वेक लॉक का इस्तेमाल किया जाता है, तो यह पक्का करना ज़रूरी है कि लिया गया हर वेक लॉक सही तरीके से रिलीज़ किया जाए. यह हमेशा उतना आसान नहीं होता जितना लगता है. उदाहरण के लिए, इस कोड में एक समस्या है:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
acquire()
doTheWork() // can potentially throw MyException
release() // does not run if an exception is thrown
}
}
Java
void doSomethingAndRelease() throws MyException {
wakeLock.acquire();
doTheWork(); // can potentially throw MyException
wakeLock.release(); // does not run if an exception is thrown
}
यहां समस्या यह है कि doTheWork() तरीका, MyException अपवाद दे सकता है. अगर ऐसा होता है, तो doSomethingAndRelease() तरीका, अपवाद को बाहर की ओर फैलाता है. साथ ही, यह release() कॉल तक कभी नहीं पहुंचता. इसका नतीजा यह होता है कि वेक लॉक लिया जाता है, लेकिन रिलीज़ नहीं किया जाता. यह बहुत खराब है.
सुधारे गए कोड में, doSomethingAndRelease() यह पक्का करता है कि अपवाद आने पर भी वेक लॉक रिलीज़ किया जाए:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
try {
acquire()
doTheWork()
} finally {
release()
}
}
}
Java
void doSomethingAndRelease() throws MyException {
try {
wakeLock.acquire();
doTheWork();
} finally {
wakeLock.release();
}
}