كيفية إزالة عملية تشغيل من كائن معالج يضاف بواسطة postdelayed؟

StackOverflow https://stackoverflow.com/questions/3627216

سؤال

انا لدي "افتح" الرسوم المتحركة وأنا أستخدم Handler.postDelayed(Runnable, delay) لتشغيل أ "قريب" الرسوم المتحركة بعد تأخير قصير. ومع ذلك ، خلال الوقت بين المفتوح والإغلاق ، ربما يكون هناك رسوم متحركة أخرى ناتجة عن النقر.

سؤالي هو ، كيف يمكنني إلغاء "قريب" الرسوم المتحركة في المعالج؟

هل كانت مفيدة؟

المحلول

فقط استخدم removeCallbacks(Runnable r) طريقة.

نصائح أخرى

إجابة كريستيان صحيحة ، ولكن على عكس ما هو مذكور في تعليقات الإجابة ، يمكنك في الواقع إزالة عمليات الاسترجاعات الخاصة بـ Anonymous Runnables بالاتصال removeCallbacksAndMessages(null);

كما هو موضح هنا:

قم بإزالة أي منشورات معلقة لعمليات الاسترجاعات وإرسالها الرسائل التي تكون OBJ رمزية. إذا كانت الرمز مميزًا لاغية ، فسيتم إزالة جميع عمليات الاسترجاعات والرسائل.

هذه إجابة متأخرة ، ولكن إليك طريقة مختلفة عندما ترغب فقط في إزالة فئة محددة من Runnables من المعالج (أي في حالة OP ، فقط قم بإزالة الرسوم المتحركة القريبة ، وترك 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);

سيتم تنفيذ الكود أعلاه "R3" ثم "R4" فقط. يتيح لك ذلك إزالة فئة محددة من Runnables المحددة بواسطة الرمز المميز الخاص بك ، دون الحاجة إلى الاحتفاظ بأي إشارات إلى Runnables نفسها.

ملاحظة: يقارن الرمز المصدر الرموز باستخدام المعامل "==" فقط (لا يستدعي .equals ()) ، لذلك من الأفضل استخدام ints/الأعداد الصحيحة بدلاً من الأوتار للرمز المميز.

إذا كنت تستخدم العودية ، فيمكنك تحقيق ذلك من خلال تمرير "هذا". انظر الرمز أدناه.

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);
}

سيقوم هذا المثال بتعيين نص TextView (Timer) كل ثانية ، ويعد العد التنازلي. بمجرد وصوله إلى 0 ، سيقوم بإزالة TextView من واجهة المستخدم وتعطيل العد التنازلي. هذا مفيد فقط لشخص يستخدم العودية ، لكنني وصلت إلى هنا بحثًا عن ذلك ، لذلك أنا أنشر نتائجي.

إذا كنت ترغب في إزالة رد الاتصال للحصول على تشغيل مجهول فقط:handler = nullسيتم إزالة كل شيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top