işleyici iptal ediliyor.


259

handler.postDelayed()Uygulamamın bir sonraki aşaması gerçekleşmeden önce bir bekleme süresi oluşturmak için kullanıyorum . Bekleme süresi boyunca ilerleme çubuğu ve iptal düğmesi olan bir iletişim kutusu görüntülüyorum .

Benim sorunum, süre dolmadan postDelayed görev iptal etmek için bir yol bulamıyorum .



Bu gist yardım umuyoruz gist.github.com/imammubin/a587192982ff8db221da14d094df6fb4 MainActivity, işleyici ve çalıştırılabilir işlevli Ekran Başlatıcı olarak, Runnable, giriş sayfası veya besleme sayfasını temel tercih ile giriş yapar.
Mubin

Yanıtlar:


479

Gecikmeli bir runnable göndermek için bunu yapmak:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

Ve bunu kaldırmak için: myHandler.removeCallbacks(myRunnable);


74
İşleyicideki tüm geri çağrıları ve mesajları iptal etmeyi göze alabilir ve runnable'a referansları tutmak istemiyorsanız, bu soruya kabul edilen cevapta üçüncü nokta yine de benim durumum için işe yarayan başka bir alternatiftir: stackoverflow. com.tr / sorular / 11299440 /… (temelde myHandler.removeCallbacksAndMessages (null);)
Mick

removeCallbacksAndMessages hile yapabilir, ama şahsen ben planlanan runnables üzerinde kontrol sahibi olmayı tercih ederim. Bir çift Runnable'ı örneklemek ve yönetmek, uygulama performanslarını öldürmez; Aksi takdirde, iki veya üçten fazla Runnable'a ihtiyacınız varsa, daha güçlü bir şeye ihtiyacınız olabilir, imho.
andrea.rinaldi

59

Aynı işleyiciye birden fazla iç / anonim çalıştırılabilir bağlantınız varsa ve aynı olay kullanımında tümünü iptal etmek istiyorsanız

handler.removeCallbacksAndMessages(null);

Belgelere göre,

Bekleyen geri arama gönderilerini ve hedefi belirteci olan gönderilen iletileri kaldırın. Simge null olursa, tüm geri aramalar ve mesajlar kaldırılır.


Bu, çalıştırılabilir tüm geri aramaları bir kez kaldıracaktır. Aksi takdirde, removeCallbacks(callback) belirli geri aramayı kaldırmak için arayın
FindOutIslamNow

18

Başka bir yol da Runnable'ın kendisini ele almaktır:

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

14
BooleanCancelMember'in nihai olması gerekmez mi, yani değiştirilemez ve bu nedenle bu amaç için işe yaramaz mı?
stealthcopter

9
@stealthcopter hayır olmak zorunda değil.
Benoit Jadinon

7
@pablisco Runnable anonim olsa bile nihai olmak zorunda değildir. Çevreleyen sınıfın bir üyesi olabilir.
Martin

6
Bunu küçümsememek, ama dikkatli ol. Bu yaklaşımla, birden fazla Runnable gecikmeli olarak yayınlanırsa, kötü yarış koşullarına girebilirsiniz. Bu, Runnable'ı iptal etmez, bu nedenle kodun yürütülüp yürütülmeyeceği, yayınlanan her Runnable için belirli bir anda booleanCancelMember değerine bağlıdır . Hangi hızla tahmin edilemez hale gelebilir.
Dennis K

1
Runnable anonim DEĞİLDİR, bu bir referans var ( rbu durumda) anlamına gelir ki ben kullanabilirsiniz anlamına gelir myHandler.removeCallbacks(r);. Runnable anonim ise, bayrak ekleyici sınıfta bir üye olacaktır, yani bayrağı değiştirmek için o nesneye bir referansa ihtiyacım var, bu da yine rde yapabileceğim anlamına geliyor myHandler.removeCallbacks(r);. Ve eğer yapıyorsam myHandler.removeCallbacks(r);böyle bir bayrak hiç gerekli değildir. Bir şey mi kaçırıyorum?
nacho4d

1

Gecikmeli eylem için iptal yöntemi sağlayan bir sınıf

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

Bir boolean üzerinden teslim runnable post gecikmeli CancelCallBacks (bu) aradığımda benim için çalıştı

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
Kodunuzda "CancelCallBacks" yok. Belki de yok çünkü? :)
İnanılmaz Ocak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.