2011-02-18 31 views
19

मुझे संदेह है .. मेरे आवेदन में एक गतिविधि में एक हैंडर है। हालांकि मेरी गतिविधि ने हैंडलर को अभी भी कामयाब कर दिया। क्या यह आवेदन प्रक्रिया के अलावा विभिन्न प्रक्रियाओं पर चल रहा है? क्या कोई यह बता सकता है कि ऐसा क्यों काम कर रहा है? क्या गतिविधि के डेस्ट्रॉय के दौरान हैंडलर को रोकना संभव है?हैंडलर को कैसे रोकें?

अग्रिम धन्यवाद।

+0

यदि आप कोड पोस्ट करते हैं तो बेहतर होगा अगर आपने हैंडलर का ब्योरा दिया हो तो बेहतर होगा। इसके अलावा, क्या आप हैंडलर को एक अलग थ्रेड पर तुरंत चालू करते हैं? – basilisk

उत्तर

1

क्या आपका मतलब है कि आपकी गतिविधि में कहीं थ्रेड है? धागा रोकना काफी आसान है, आपको उस धागे का संदर्भ होना चाहिए। जैसे:

private Thread mMyThread; 
mMyThread = new Thread ....... 

और जब आप इसे बंद करना चाहते हैं, बस अगर संदर्भ रिक्त नहीं है की जाँच करें और फोन बाधा विधि:

if (mMyThread != null) { 
    mMyThread.interrupt(); 
} 

आशा है कि यह मदद मिलेगी

+0

धन्यवाद ... यह बहुत मदद करता है ... – Taruni

25

में बताया गया है प्रलेखन

http://developer.android.com/reference/android/os/Handler.html

"प्रत्येक हैंडलर उदाहरण एक धागे और उस थ्रेड के संदेश कतार से जुड़ा हुआ है। "

जब आप अपनी गतिविधि समाप्त करने वाले हैं, उदा। onDestroy() में आप भी runnable इसके लिए शुरू किया गया था के लिए कॉलबैक रद्द करने की आवश्यकता:

mHandler.removeCallbacks(previouslyStartedRunnable); 

आप क्या कर सकते हैं कि यहां तक ​​कि पता चल सके कि runnable पहले से ही निकाल दिया गया था, जबकि अपनी गतिविधि सक्रिय था बिना।

अद्यतन:

वहाँ दो अतिरिक्त मामलों विचार किया जाना है:

1.) आप एक तरीका है कि आप Runnable, उदा नया वर्ग बनाया में अपने हैंडलर को लागू किया है

private class HandleUpdateInd implements Runnable... 

आमतौर पर आपको बस इतना करना है कि मानकों के वर्तमान सेट (जो runnable आग जब तक बदल सकते हैं) के साथ runnable देरी शुरू करने के लिए यदि आप है की जरूरत है। इसे रद्द करने के लिए आप

mHandler.removeCallbacksAndMessages(HandleUpdateInd.class); 

2. उपयोग करने के लिए) आप इनलाइन कॉल (टिप्पणी के लिए धन्यवाद JPM)

handler = new Handler() { public void handleMessage(Message msg) { ... } }; 

तो फिर तुम परिभाषित करने के लिए "क्या" है कि संदेश के लिए मूल्य की जरूरत उपयोग कर रहे हैं की जरूरत है। बाद में, यदि आपको इसे रद्द करने की आवश्यकता है तो आप उस कार्य को करने के लिए

handler.removeMessages(what); 

का उपयोग कर सकते हैं।

+1

यदि आप अपने गतिविधि में एक इनलाइन कॉल करते हैं तो यह कैसे करते हैं? यानी हैंडलर = नया हैंडलर() {सार्वजनिक शून्य संभाल संदेश (संदेश संदेश) {...}}; – JPM

+0

संदेश भेजते समय, आपको "क्या" मान परिभाषित करना होगा। फिर आप इसे बाद में देख सकते हैं और हैंडलर.remove संदेश (क्या) का अनुरोध कर सकते हैं; – Zelimir

0

मुझे ज़ेलिमिर का जवाब पसंद है, इस मामले पर कुछ और जानकारी - एंड्रॉइड किसी एप्लिकेशन जीवन के लिए सीमा निर्धारित नहीं करता है, एप्लिकेशन पहली शुरुआत में बनाया गया है, और कई गतिविधियां क्रिएट/ऑनस्ट्रोय चक्रों के बीच जीवित रह सकता है। हैंडलर एप्लिकेशन सिंगल मुख्य इवेंट थ्रेड/कतार से जुड़े होते हैं, इसलिए कोई गतिविधि इसे "रोक" नहीं सकती है (हालांकि आप शायद हैंडलर .getLooper() के माध्यम से ऐसा कर सकते हैं। छोड़ें(), लेकिन मुझे यकीन नहीं है कि यह ' टी समस्याओं का कारण बनता है। आप यहां here वर्णित अनुसार पूरे आवेदन को मार सकते हैं)।

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

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