2010-09-02 12 views
62

मेरे पास "खुला" एनीमेशन है और Handler.postDelayed(Runnable, delay) का उपयोग "बंद करें" एनीमेशन को थोड़ी देर के बाद ट्रिगर करने के लिए कर रहा है। हालांकि, खुले और नज़दीक के बीच के दौरान, एक क्लिक द्वारा संभवतः एक और एनीमेशन ट्रिगर किया जाता है।PostDelayed द्वारा जोड़े गए हैंडलर ऑब्जेक्ट से रननेबल को कैसे निकालें?

मेरा सवाल है, मैं हैंडलर में "करीबी" एनीमेशन कैसे रद्द करूं?

उत्तर

86

बस removeCallbacks(Runnable r) विधि का उपयोग करें।

+5

क्या अज्ञात रननेबल के लिए कॉलबैक को निकालना संभव है? –

+7

मुझे ऐसा नहीं लगता ... आपको गैर-अज्ञात लोगों का उपयोग करना होगा। अन्यथा आप भविष्य में उन्हें संदर्भित नहीं कर पाएंगे। – Cristian

+3

@ नामस्थान का उत्तर देखें। यदि आप एक टोकन के साथ रननेबल पोस्ट करते हैं तो आप लंबित रननेबल को हटा सकते हैं। या आप एक नल टोकन का उपयोग कर सभी कॉलबैक/संदेशों को हटाने के डैनियल एल की विधि का उपयोग कर सकते हैं। – vman

8

यदि आप रिकर्सन का उपयोग कर रहे हैं, तो आप इसे "इस" से गुजरकर इसे प्राप्त कर सकते हैं। नीचे कोड देखें।

public void countDown(final int c){ 
    mHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      aq.id(R.id.timer).text((c-1)+""); 
      if(c <= 1){ 
       aq.id(R.id.timer).gone(); 
       mHandler.removeCallbacks(this); 
      }else{ 
       countDown(c-1); 
      } 
     } 
    }, 1000); 
} 

यह उदाहरण प्रति सेकंड टेक्स्टव्यू (टाइमर) का पाठ सेट करेगा, जो गिनती है। एक बार यह 0 हो जाने पर, यह यूआई से टेक्स्ट व्यू को हटा देगा और उलटी गिनती को अक्षम कर देगा। यह केवल उन लोगों के लिए उपयोगी है जो रिकर्सन का उपयोग कर रहे हैं, लेकिन मैं यहां खोज कर आया हूं, इसलिए मैं अपने परिणाम पोस्ट कर रहा हूं।

80

क्रिस्टियन के जवाब सही है, लेकिन जैसा कि क्या जवाब की टिप्पणी में कहा गया है करने का विरोध किया, तो आप वास्तव गुमनाम Runnables के लिए कॉलबैक removeCallbacksAndMessages(null);

फोन करके here कहा गया है हटा सकते हैं:

किसी भी लंबित पोस्ट निकालें कॉलबैक और भेजे गए संदेश जिनके ओबीजे टोकन हैं। यदि टोकन शून्य है, तो सभी कॉलबैक और संदेश हटा दिए जाएंगे।

+4

मैं यह इंगित करना चाहता हूं कि यह व्यवहार अलग है चाहे आप 'हैंडलर' या 'व्यू' क्लास से निपट रहे हों। 'व्यू' क्लास (और शायद 4.0 के बाद?) में, आपको कार्य को रद्द करने के लिए उसी 'रननेबल' ऑब्जेक्ट का उपयोग करना होगा, जबकि 'हैंडलर' क्लास के साथ वे सभी को रद्द कर देंगे यदि आप 'शून्य' पास करते हैं। फिर भी, प्रश्न 'हैंडलर' निर्दिष्ट करता है, इसलिए आपका उत्तर सही है। – Andre

+1

वास्तव में !! धन्यवाद .. वहाँ कुछ चलने योग्य था, और हटा दें कॉलबैक ने कुछ भी नहीं किया !!!!! लेकिन यह वास्तव में काम किया :) thx – cV2

10

यह यहाँ एक देर से जवाब है, लेकिन जब आप केवल हैंडलर (यानी ओपी के मामले में से runnables की एक विशिष्ट श्रेणी को हटाने के लिए, बंद एनीमेशन बस को निकालने के लिए एक अलग पद्धति है, कतार में अन्य runnables छोड़ने):

int firstToken = 5; 
    int secondToken = 6; 

    //r1 to r4 are all different instances or implementations of Runnable. 
    mHandler.postAtTime(r1, firstToken, 0); 
    mHandler.postAtTime(r2, firstToken, 0); 
    mHandler.postAtTime(r3, secondToken, 0); 

    mHandler.removeCallbacksAndMessages(firstToken); 

    mHandler.postAtTime(r4, firstToken, 0); 

उपर्युक्त कोड केवल "आर 3" और फिर "आर 4" निष्पादित करेगा। यह आपको अपने टोकन द्वारा परिभाषित रननेबल्स की एक विशिष्ट श्रेणी को हटाने देता है, बिना रननेबल्स के किसी भी संदर्भ को रखने के लिए।

नोट: स्रोत कोड केवल "==" ऑपरेंड का उपयोग करके टोकन की तुलना करता है (यह .equals() को कॉल नहीं करता है), तो टोकन के लिए तारों के बजाय इंक/इंटीग्रर्स का उपयोग करना सबसे अच्छा है।

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