2009-12-28 11 views
12

मेरी समस्या यह है कि मुझे 1 सेकंड की देरी के साथ संदेश भेजने की आवश्यकता है। हैंडलर फिर कुछ कार्रवाई शुरू करता है, आपको तस्वीर मिल रही है।हैंडलर पर पहुंचने से पहले देरी संदेशों को कैसे हटाएं?

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

उत्तर

35

removeMessages() विधियों के बारे में कुछ भी डरावना नहीं है; वे पूरी तरह से सुरक्षित हैं। ढांचा इन तरीकों पर भारी निर्भर करता है और इन्हें कई स्थानों में उपयोग किया जाता है, खासकर डिफ़ॉल्ट विजेट (View, ListView, आदि) में यह Handler बनाने से कहीं अधिक बेहतर है जो विशिष्ट संदेशों को अनदेखा करता है। यह प्रोग्रामिंग है, अपनी भावनाओं के साथ मत जाओ: पी

+0

यह उन तरीकों पर अधिक दस्तावेज़ीकरण होगा यदि सभी विध्वंस तंत्र (जैसे, पोस्टरनेबल()) पर 'क्या' पैरामीटर उपलब्ध था, यदि 'क्या' और 'टोकन' के बीच भेद स्पष्ट था, आदि। अगर मुझे हैंडलर आज क्या कर रहा है, यह जानने के लिए एंड्रॉइड स्रोत कोड के माध्यम से मुझे गुस्से में आना है, तो इसका मतलब है कि मुझे कोई गारंटी नहीं है कि इस तरह के अनियंत्रित व्यवहार कल सुसंगत रहेगा। इसलिए, निकालें मैसेज() हैं, आईएमएचओ, डेवलपर्स के लिए भरोसा करने के लिए डरावना है। इसे साफ़ करने में बहुत कुछ नहीं लगेगा, लेकिन मैं निर्णय लेने के लिए निर्णय नहीं ले सकता कि क्या है और हैंडलर व्यवहार उचित नहीं है। – CommonsWare

+0

कि आपके अंतिम वाक्य ने मेरा दिन स्पष्ट रूप से बनाया है। लेकिन इसके अलावा, मैं इस बात से सहमत हूं कि दस्तावेज वास्तव में उस क्षेत्र में अपर्याप्त है, शायद मुझे टिकट दर्ज करना चाहिए। – moritz

+1

जब आप रननेबल पोस्ट करते हैं तो "क्या" होने का कोई कारण नहीं है, आप इसके लिए removeCallback() का उपयोग करें। दस्तावेज़ीकरण से बिल्कुल गारंटी नहीं है? –

5

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

private Runnable lastMyRunnablePtr = null; 

...

private class MyRunnable implements Runnable 
{} 

....

lastMyRunnablePtr = new MyRunnable(); 
mHandler.postDelayed(lastMyRunnablePtr ,30000); 

....

protected void onDestroy() { 
    mHandler.removeCallbacks(lastMyRunnablePtr); 
} 
0

असल में, आप handler.removeMessages(int, obj) के कार्यान्वयन पर विचार करना चाहिए। यदि ओबीजे ऑटोबॉक्सिंग से संबंधित एक वस्तु है, तो आप एंड्रॉइड MessageQueue के कार्यान्वयन की समस्या को पूरा करेंगे।

कोड स्निपेट के लिए, निकालें मैसेज ऑटो-मुक्केबाजी, boxing-conversion और ऑब्जेक्ट की तुलना करने के लिए p.obj == ऑब्जेक्ट का उपयोग करके MessageQueue का अपूर्णता के परिणामस्वरूप काम नहीं करेगा।

Message msg = handler.obtainMessage(what, 256); 
handler.sendMessageDelayed(message, delayMillis); 
handler.removeMessages(what, 256); 

इस post को रेफरी करें।

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