2011-05-07 16 views
20

pm और keepScreenOn चर वैश्विक स्तर पर परिभाषित किए जाने पर अंतिम रूप दिया गया।वेक लॉक को अभी भी

मैं अपने OnCreate विधि में PowerManager.WakeLock हड़पने:

pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
keepScreenOn = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_LOCK,"tpd"); 
मेरी onStart, onResume में

, और onRestart मैं अपने OnDestroy, onPause, और onStop में

if (keepScreenOn == null) { 
    keepScreenOn = pm.newakeLock(PowerManager,SCREEN_BRIGHT_LOCK,"tpd"); 
} 
keepScreenOn.acquire(); 

साथ ताला हड़पने मैंने लॉक को रिलीज़ किया:

if (keepScreenOn != null) { 
    keepScreenOn.release(); 
    keepScreenOn = null 
} 

मेरे ऐप से बाहर निकलने के बाद मुझे विफलता स्क्रीन और एडीबी शिकायत मिलती है ains कि

java.lang.Exception: Wakelock को अंतिम रूप दिया, जबकि अभी भी आयोजित: टीपीडी

ट्रेसिंग से पता चलता है कि मैं बाहर निकलने से पहले ताला जारी किया। मुझे क्या याद आया?

वहाँ कम से कम एक, onStop, या onDestroy पार करने के बिना कोई रास्ता नहीं है ऐप्लिकेशन से प्रस्थान। मैं देख सकता हूं कि ऐप release() जितनी बार इसे अधिग्रहण() कहा जाता है, भले ही वाकेलॉक संदर्भित है, फिर भी इसमें शून्य रेफरी होनी चाहिए।

+0

हो सकता है कि यह आपकी समस्या से संबंधित न हो, लेकिन आप इतने सारे स्थानों में लॉक क्यों बना रहे हैं और क्यों जारी कर रहे हैं? क्यों न केवल रेज़्यूम और पर रोकें? – Olegas

+0

मैंने कोशिश की। फिर मैंने प्रत्येक XXX दिनचर्या का पता लगाया। फिर मैंने इसे –

+0

जोड़ा है क्या आपका 'keepScreenOn' चर क्लास में केवल एक बार घोषित किया गया है? क्या कम दायरे के साथ कुछ अन्य घोषणाएं हैं (यानी विधि में घोषित)। – Olegas

उत्तर

0

नहीं, वैश्विक दायरे में केवल एक घोषणा है और सभी कॉल प्राप्त करने के लिए कॉल() और रिलीज() उस दायरे में होते हैं। I जब वे होते हैं तो println और अधिग्रहण() एक बार होता है और रिलीज़ एक बार होता है।

27

ठीक है मुझे विश्वास है कि मुझे समस्या मिली है।

वेक लॉक संदर्भ गिना जाता है। इसका मतलब है कि यदि एक दूसरा acquire() होता है तो यह केवल संदर्भ गणना को टक्कर देगा। acquire() आवश्यकताओं के हर कॉल में के रूप में isHeld() के लिए एक कॉल द्वारा संरक्षित किया जाना:

if ((keepScreenOn != null) &&   // we have a WakeLock 
    (keepScreenOn.isHeld() == false)) { // but we don't hold it 
    keepScreenOn.acquire(); 
} 

मैं मान लिया था कि acquire() एक ताला मैं आयोजित पर कुछ भी नहीं किया तो कई acquire() कॉल समस्या का कारण बना। चूंकि संदर्भ गिनती शून्य नहीं है क्योंकि जीसी एक त्रुटि फेंकता है।

3

मुझे पता है कि यह प्रश्न पुराना है, लेकिन ध्यान रखें कि WakeLocks डिफ़ॉल्ट रूप से 'संदर्भ गिना जाता है'। आप setReferenceCounted(boolean) का उपयोग कर संदर्भ गणना को बंद कर सकते हैं, http://developer.android.com/reference/android/os/PowerManager.WakeLock.html#setReferenceCounted(boolean)

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