2012-02-09 6 views
5

में रन विधि पर अमल मैं मुख्य ui धागा (mUIHandler) में एक हैंडलर उदाहरण बनाया है और एक कार्यकर्ता धागा (अन्य धागा) जब मैं के रन विधि निष्पादित करने के लिए कोशिश कर रहा हूँ से रननेबल रन विधि को 10 बार में से 9 में निष्पादित किया जाता है लेकिन 1 बार ऐसा होता है जब इसे निष्पादित नहीं किया जाता है।handler.post (runnable) does not को हमेशा एंड्रॉयड

mUIHandler.post (uiRunnable) -> क्या यह हमेशा चलने योग्य रन विधि को निष्पादित करने की गारंटी नहीं देता है?

मैं भी लॉग तरीकों की जांच करने और देख सकता था कि पोस्ट विधि innvocation तक लॉग निष्पादित हो जाता है लेकिन रन विधि लॉग प्रदर्शित हो नहीं जुड़ी हो।

कैसे पोस्ट (runnable) आंतरिक रूप से काम करता है? क्या यह गारंटी देता है कि जैसे ही पोस्ट लागू किया जाता है, ui धागा (हैंडलर के साथ धागा) इसे उत्साहित करेगा?

किसी भी मदद की सराहना की जाएगी।

धन्यवाद!

+4

समस्या से संबंधित पोस्ट कोड। – kosa

+1

@ थिंकस्टीप यह देखने के लिए नीचे मैटक द्वारा दिए गए सुझाव को देखने का प्रयास करेगा कि क्या मैं इसके बारे में कुछ कर सकता हूं। मैं यहां कोड स्निपेट को कोड की 500 से अधिक लाइनों के रूप में पोस्ट करने से परहेज कर रहा हूं। धन्यवाद! – Deva

उत्तर

6

मैं कभी नहीं देखा है एक हैंडलर ठीक से runnable तैनात नहीं चला। कुछ बातें की जांच के लिए:

  1. वहाँ किसी भी तर्क है कि डेटा धागा संभावित जबकि यूआई धागा runnable निष्पादित हो रहा है के साथ बातचीत की जा सकती है जो रेस स्थिति हो सकती है?
  2. क्या आपके पास कहीं भी कोशिश/पकड़ है जो चुपचाप अपवाद खा सकता है?

मेरा वोट (आपका कोड देखे बिना) यह शायद # 1 है। समवर्ती तर्क के परिणामस्वरूप आप हार्ड-टू-ट्रैक-डाउन रेस स्थितियों से पीड़ित होने वाले पहले व्यक्ति नहीं होंगे।

+0

उत्तर के लिए धन्यवाद मैटसी मैं एक संभावित दौड़ की स्थिति के लिए जांच पार कर दूंगा। (उम्मीद है कि मैं इसे ढूँढ सकता हूं।) अपडेट होगा। – Deva

+1

धन्यवाद @ मैटसी यह दौड़ की स्थिति थी जो इसे कर रही थी। धन्यवाद कारण खोजने में सक्षम था। वास्तव में एक अच्छी शिक्षा। – Deva

+0

खुशी है कि आपको यह मिला। थ्रेड तर्क तर्कसंगत रूप से परिष्कृत और डीबग करने के लिए मुश्किल है। – MattC

10

मैं अपने मामले दोनों Runnables और संदेश के साथ-साथ Android 2.2 पर इस समस्या हुई, एक ही हैंडलर के साथ प्रयोग किया जा रहा था।

हैंडलर स्रोत कोड को देखने के बाद, यह पता चला है 0 से 'क्या मूल्य के साथ संदेश निकालते समय भी निकाल देता है कि सभी Runnables भेज दिए जाएंगे। ऐसा इसलिए होता है क्योंकि हैंडलर क्लास में एक रननेबल को आंतरिक रूप से शून्य के 'क्या' मान वाले संदेश के रूप में पोस्ट किया जाता है, जिसे सभी को removeMessages(0) पर किसी भी कॉल द्वारा हटा दिया जाता है। इसलिए, संदेश आईडी के रूप में शून्य का उपयोग करने से बचें।

+0

यदि केवल दो पसंदीदा उत्तर हो सकते हैं। मुझे नहीं पता कि आपने मुझे इस जवाब के साथ कितना समय बचाया है, लेकिन यह बहुत समय है! –