2010-01-16 14 views
5

के भीतर से अवरुद्ध संवाद मैं एक ऐप लिख रहा हूं जो मूल रूप से 250 के जेएनआई के आसपास एक रैपर है। जेएनआई (एक गेम इंजन) में एपीआई हैं जैसे हैंडल_पेनअप (इंट एक्स, इंट वाई)। कभी-कभी इसे उपयोगकर्ता को हैंडल_पेनअप() (जावा कोड में कॉलबैक के माध्यम से) से पूछताछ करने की आवश्यकता होती है, इसलिए क्वेरी को लागू करने के लिए मैं जिस संवाद का उपयोग करता हूं उसे ब्लॉक करना होगा।जेएनआई कोड

मैं समझता हूं कि निष्पादन का मुख्य धागा अवरुद्ध नहीं हो सकता है। तो मैंने एक दूसरा थ्रेड तैयार किया है जो सभी जेएनआई कॉल करता है जिसके परिणामस्वरूप कॉलबैक को अवरुद्ध करने की आवश्यकता होगी। उस दूसरे धागे के अंदर, जब मुझे अवरुद्ध संवाद करने की आवश्यकता होती है, तो मैं startActivityForResult() को कॉल करता हूं और फिर सेमेफोर पर() प्राप्त करता हूं। जब एक्टिविटी रिसेट() को मुख्य थ्रेड पर कॉल किया जाता है तो यह उसी सेमफोर पर रिलीज() को कॉल करता है।

यह काम करता है यदि मेरी क्वेरी एक नई गतिविधि के रूप में लागू की गई है, लेकिन यदि मैं मौजूदा गतिविधि के भीतर Dialog() नहीं दिखाना चाहता हूं। लॉग संदेश मुझे बताओ कि मेरे धागे को लूपर की जरूरत है। मैं एक जोड़ रहा हूं - और यह काम करता है कि यह काम करता है - लेकिन ऐसा लगता है जैसे मैं गलत रास्ते पर जा रहा हूं। मुझे जो अवरोध करना है, वह ब्लॉकिंग संवाद करने के लिए एक नुस्खा है (उपयोगी अगर केवल इसलिए कि हर दूसरे प्लेटफ़ॉर्म में उन्हें और इसलिए पोर्ट किया गया कोड अक्सर उस तरह से काम करेगा।)

उत्तर

0

आप निश्चित रूप से दो यूआई थ्रेड नहीं चाहते हैं। वहां केवल एक धागा होना चाहिए जो एंड्रॉइड एसडीके के साथ संचार प्रवाह और प्रदर्शन के साथ संचार करता है (यानी ड्राइंग से संबंधित कुछ भी, गतिविधियों को शुरू करना, संवाद प्रदर्शित करना आदि)।

इसके अलावा, ध्यान रखें कि आप वास्तव में अपने धागे को चलाना नहीं चाहते हैं - सब कुछ घटनाओं पर आधारित है, इसलिए आप चाहते हैं कि आपका कोड कुछ जवाब दे, कुछ करें, और फिर जितनी जल्दी हो सके बाहर निकलें।

जब आप "ब्लॉक" कहते हैं, तो आपका क्या मतलब है? क्या अवरुद्ध करने की जरूरत है? यदि आपको बस घटनाओं का जवाब देना बंद करना है, तो क्यों एक बुलियन नहीं है जो संवाद के दौरान सत्य पर सेट किया गया है, और यह सच होने पर सभी घटनाओं को अनदेखा करता है?

+0

गैर अवरुद्ध कब शायद बनाम रोकने में के रूप में ब्लॉक (कॉल जब तक वापस नहीं करता है आशा उसने अनुरोधित इनपुट प्राप्त किया है या असफल रहा है, बनाम तत्काल लौट रहा है और यदि कोई भी बफर में पहले से ही इनपुट कर रहा है तो रिपोर्टिंग) –

2

यह टच थ्रेड से दृश्यमान/अदृश्य दृश्य को सेट करने के साथ एक समस्या के बहुत करीब था।

समस्या

कि आप जीयूआई पर कुछ कार्यों ऐसा नहीं कर सकते एक और धागा फार्म

है कि आप क्या करने की जरूरत है अपने मुख्य थ्रेड में एक हैंडल का उपयोग करना है (जो आपके मामला है) है मैं इसे में घोषित गतिविधि

public static final Handler handlerVisibility = new Handler() { 
    public void handleMessage(Message msg) { 
     int visibility = msg.getData().getInt("visibility"); 
     view.setVisibility(visibility); 
    } 
}; 

मैं सार्वजनिक स्थिर ताकि मैं में कहीं भी एक्सेस कर करने का विकल्प चुना है (क्योंकि मैं कभी एक समय में एक से अधिक फोन है और मैं इसे उप वर्गों के लिए साथ दी जाने वाली आलसी महसूस किया है कि)।

तो आप क्या करना चाहते हैं तो इस हैंडलर के लिए एक संदेश भेजने के लिए और है के बाद से हैंडलर जीयूआई यह काम करता है ^^

Message msg = MainActivity.handlerVisibility.obtainMessage(); 
    Bundle b = new Bundle(); 
      b.putInt("visibility", View.VISIBLE); 
    msg.setData(b); 
      MainActivity.handlerVisibility.sendMessage(msg); 

कि आपके looper त्रुटि को हल करने और करने के लिए आप की अनुमति चाहिए के रूप में ही धागे में है एक और

को एक धागे से जीयूआई अनुरोध भेजने यह

जेसन में मदद करता है

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