एक हैंडलर को रद्द करना


259

मैं handler.postDelayed()अपने ऐप के अगले चरण के होने से पहले प्रतीक्षा अवधि बनाने के लिए उपयोग कर रहा हूं । प्रतीक्षा अवधि के दौरान मैं प्रगति बार और रद्द बटन के साथ एक संवाद प्रदर्शित कर रहा हूं ।

मेरी समस्या यह है कि मैं समय बीतने से पहले पोस्टडेलिड कार्य को रद्द करने का कोई तरीका नहीं खोज सकता ।



आशा है कि यह मदद gist.github.com/imammubin/a587192982ff8db221da14d094df6fb4 हैंडलर और रन करने योग्य फ़ंक्शन के साथ स्क्रीन लॉन्चर के रूप में MainActivity, Runbable रन टू लॉग पेज या फीड पेज के साथ आधार वरीयता लॉगिन उपयोगकर्ता के साथ फायरबेस के साथ फ़ीड करें।
मुबीन

जवाबों:


479

मैं देरी से चलने योग्य पोस्ट करने के लिए ऐसा करता हूं:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

और इसे हटाने के लिए: myHandler.removeCallbacks(myRunnable);


74
यदि आप हैंडलर पर सभी कॉलबैक और संदेशों को रद्द करने का जोखिम उठा सकते हैं और इस सवाल के स्वीकृत जवाब में रनवेबल को तीसरे बिंदु के संदर्भ में नहीं रखना चाहते हैं, तो यह एक और विकल्प है जो मेरे मामले के लिए वैसे भी काम करता प्रतीत होता है: स्टैकओवरफ़्लो। com / सवाल / 11299440 /… (अनिवार्य रूप से myHandler.removeCallbacksAndMessages (अशक्त) कॉल करना)
मिक

removeCallbacksAndMessages ट्रिक कर सकता है, लेकिन व्यक्तिगत रूप से मैं निर्धारित रनवे पर नियंत्रण रखना पसंद करता हूं। Runnables की एक जोड़ी को स्थापित करना और संभालना आपको ऐप के प्रदर्शन को नहीं मार देगा; अन्यथा, यदि आपको दो या तीन से अधिक Runnables की आवश्यकता है, तो आपको कुछ अधिक शक्तिशाली, imho की आवश्यकता हो सकती है।
andrea.rinaldi

59

यदि आपके पास एक ही हैंडलर के लिए कई आंतरिक / अनाम रनवेबल्स हैं, और आप एक ही ईवेंट उपयोग पर रद्द करना चाहते हैं

handler.removeCallbacksAndMessages(null);

प्रलेखन के अनुसार,

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


यह एक बार में सभी रन करने योग्य कॉलबैक को हटा देगा। अन्यथा, removeCallbacks(callback) विशिष्ट कॉलबैक को हटाने के लिए कॉल करें
FindOutIslamNow

18

एक और तरीका यह है कि रननेबल को खुद ही संभालना है:

Runnable r = new Runnable {
    public void run() {
        if (booleanCancelMember != false) {
            //do what you need
        }
    }
}

14
BooleanCancelMember को अंतिम नहीं होना होगा, जिसका अर्थ है कि इसे बदला नहीं जा सकता है और इस प्रकार इस उद्देश्य के लिए बेकार है?
स्टील्थोप्टर

9
@stealthcopter नहीं होना चाहिए।
बेनोइट जैडिनन

7
@pablisco रननेबल के अनाम होने पर भी अंतिम होना आवश्यक नहीं है। यह एनक्लोजिंग क्लास में एक सदस्य हो सकता है।
मार्टिन

6
इसको नीचा नहीं बल्कि सावधान रहें। इस दृष्टिकोण के साथ, यदि कई Runnables देरी से पोस्ट किए जाते हैं, तो आप बुरा दौड़ की स्थिति में दौड़ सकते हैं। यह Runnable को रद्द नहीं करता है, इसलिए उस कोड को निष्पादित किया जाएगा या नहीं यह प्रत्येक पोस्ट किए गए Runnable के लिए विशिष्ट क्षण पर booleanCancelMember के मूल्य पर निर्भर करता है । जो जल्दी अप्रत्याशित हो सकता है।
डेनिस के

1
यदि Runnable नहीं है, तो इसका मतलब यह नहीं है कि मेरे पास इसका संदर्भ है ( rइस मामले में) जिसका अर्थ है कि मैं उपयोग कर सकता हूं myHandler.removeCallbacks(r);। यदि रननेबल अनाम है, तो ध्वज एन्क्लोज़िंग क्लास में एक सदस्य होगा, जिसका अर्थ है कि मुझे ध्वज को बदलने के लिए उस ऑब्जेक्ट के लिए एक संदर्भ की आवश्यकता है, जिसका मतलब है कि मेरे पास फिर से रास्ते होंगे r, जिसका मतलब है कि मैं कर सकता हूं myHandler.removeCallbacks(r);। और अगर मैं कर रहा हूं myHandler.removeCallbacks(r);तो ऐसा झंडा जरूरी नहीं है। क्या मैं कुछ भूल रहा हूँ?
nacho4d

1

यहां विलंबित कार्रवाई के लिए रद्द करने की विधि प्रदान करने वाला एक वर्ग है

public class DelayedAction {

private Handler _handler;
private Runnable _runnable;

/**
 * Constructor
 * @param runnable The runnable
 * @param delay The delay (in milli sec) to wait before running the runnable
 */
public DelayedAction(Runnable runnable, long delay) {
    _handler = new Handler(Looper.getMainLooper());
    _runnable = runnable;
    _handler.postDelayed(_runnable, delay);
}

/**
 * Cancel a runnable
 */
public void cancel() {
    if ( _handler == null || _runnable == null ) {
        return;
    }
    _handler.removeCallbacks(_runnable);
}}

0

मेरे लिए यह तब काम आया जब मैंने कॉल को रद्द कर दिया (इस) पोस्ट के अंदर एक बूलियन के माध्यम से इसे चलाने के लिए देरी से चलने योग्य।

Runnable runnable = new Runnable(){
    @Override
    public void run() {
        Log.e("HANDLER", "run: Outside Runnable");
        if (IsRecording) {
            Log.e("HANDLER", "run: Runnable");
            handler.postDelayed(this, 2000);
        }else{
            handler.removeCallbacks(this);
        }
    }
};

3
आपके कोड में कोई "CancelCallBacks" नहीं है। हो सकता है "क्योंकि यह मौजूद नहीं है? :)
अविश्वसनीय जन

-1

आशा है कि यह मदद https://gist.github.com/imammubin/a587192982ff8db221da14d094df6fb4

हैंडलर और रन करने योग्य फ़ंक्शन के साथ स्क्रीन लॉन्चर के रूप में मुख्यता, फायरबेस के साथ आधार वरीयता लॉगिन उपयोगकर्ता के साथ रनने योग्य रन टू लॉग पेज या फीड पेज।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.