यह प्रश्न एंड्रॉइड पर ईवेंट हैंडलिंग के बारे में है। यह सी ++ के लिए विशिष्ट नहीं है।मैं एंड्रॉइड पर गैर-अवरुद्ध घटनाओं को कैसे संसाधित कर सकता हूं?
मुझे यूआई/ओएस घटनाओं को संसाधित करने की आवश्यकता है, बिना किसी घटना के संसाधित होने पर अवरुद्ध किए।
कारण यह है कि आवेदन मैं पोर्टिंग हूँ बहुत बड़ी है और आसानी से एक कार्यकर्ता धागे पर अपने स्वयं के सामान से निपटने के लिए फिर से लिखा नहीं किया जा सकता है। इसके बजाय एप्लिकेशन इंजन लंबे समय से चलने वाले संचालन के दौरान यूआई/ओएस घटनाओं को संसाधित करने के लिए कहता है जो अन्यथा अवरुद्ध हो जाएगा।
मुझे पता चला है कि ALooper_pollAll (...) मेरे लिए यह नहीं करता है। यदि मैं, उदाहरण के लिए, मेरी गतिविधि में एक संवाद बनाएं और एक लंबा ऑपरेशन शुरू करें, तो ALooper_pollAll() मेरा संवाद नहीं दिखाएगा - यह केवल तभी दिखाई देगा जब मैं मुख्य लूप पर वापस आऊंगा (मैंने इसे नेटविंडोक्रेटेड में परीक्षण किया था)।
एकमात्र समाधान है कि मैं लगभग काम करने के लिए मिल गया है, यूआई धागे पर एक आंतरिक पाश करना है JNI के माध्यम से निम्नलिखित कोड को फोन करके:
public class MyActivity extends NativeActivity {
private Handler _uiEventsHandler = null;
private Runnable _uiEventsTask = new Runnable() {
public void run() {
Looper looper = Looper.myLooper();
looper.quit();
_uiEventsHandler.removeCallbacks(this);
_uiEventsHandler = null;
}
};
public void ProcessEvents(int timeout)
{
if (_uiEventsHandler==null) {
Looper looper = Looper.myLooper();
_uiEventsHandler = new Handler(looper);
_uiEventsHandler.removeCallbacks(_uiEventsTask);
//_uiEventsHandler.postDelayed(_uiEventsTask,timeout);
_uiEventsHandler.post(_uiEventsTask);
try {
looper.loop();
} catch (RuntimeException re) {
// We get an exception when we try to quit the loop, but the inner loop actually terminates
}
}
}
}
यह वह जगह है, तथापि, नहीं सर्वोत्कृष्ट समाधान, क्योंकि यह तब तक लूप नहीं करेगा जब तक प्रक्रिया करने के लिए कोई और घटना नहीं होगी (क्योंकि लूप के दौरान घटनाएं बनाई जा सकती हैं)।
अपना शोध के दौरान मैं ने पाया है कि मैं Looper से MessageQueue हो और एक IdleHandler है कि मेरे भीतर के पाश छोड़ सकते जोड़ सकते हैं। मैंने अभी तक यह कोशिश नहीं की है, एक बेहतर तरीका होना चाहिए।
तथ्य यह है कि इस वास्तुकला के साथ मैं छड़ी चाहिए, एक बेहतर समाधान क्या है यह देखते हुए?
अद्यतन:
MessageQueue मैं प्राप्त करने के लिए मैं क्या जरूरत है सक्षम हूँ का उपयोग करना:
public class MyActivity extends NativeActivity {
private class IdleHandler implements MessageQueue.IdleHandler {
private Looper _looper;
protected IdleHandler(Looper looper) {
_looper = looper;
}
public boolean queueIdle() {
_uiEventsHandler = new Handler(_looper);
_uiEventsHandler.post(_uiEventsTask);
return(false);
}
};
private boolean _processingEventsf = false;
private Handler _uiEventsHandler = null;
private Runnable _uiEventsTask = new Runnable() {
public void run() {
Looper looper = Looper.myLooper();
looper.quit();
_uiEventsHandler.removeCallbacks(this);
_uiEventsHandler = null;
}
};
public void ProcessEvents()
{
if (!_processingEventsf) {
Looper looper = Looper.myLooper();
looper.myQueue().addIdleHandler(new IdleHandler(looper));
_processingEventsf = true;
try {
looper.loop();
} catch (RuntimeException re) {
// We get an exception when we try to quit the loop.
}
_processingEventsf = false;
}
}
}
हालांकि, मैं अब भी अगर वहाँ एक बेहतर समाधान है जानना चाहूंगा।
वाह। :) मैं पूरी तरह इसमें से अधिकांश (सिर्फ 2-3 सप्ताह पहले एंड्रॉयड poking शुरू कर दिया) समझ में नहीं आता है, लेकिन मैं निश्चित रूप से कर सकते हैं मुझे लगता है कि जल्द ही बाद में मुझे इस सामान की भी आवश्यकता होगी, इसलिए मैं इसे तुरंत पसंद करता हूं। :) धन्यवाद! –