1
votes

Comment éviter qu'un handler.postDelayed (Runnable run) ne soit appelé?

J'ai cette méthode pour scanner les appareils Bluetooth LE. Le scanner fonctionne de manière asynchrone pendant 10 s, puis il est interrompu.

 public void startScanning() {
    Handler handler = new Handler();

    final long SCAN_PERIOD = 10000;
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            btScanner.stopScan(leScanCallback);
        }
    }, SCAN_PERIOD);
    btScanner.startScan(leScanCallback);
}

Cependant, en fonction d'une condition vérifiée lors de l'analyse (par exemple, je trouve un appareil que je recherchais, etc. ), J'appelle btScanner.stopScan (leScanCallback) . Donc je ne veux pas appeler le stopScan après SCAN_PERIOD sinon je l'appellerais deux fois. Comment éviter le deuxième appel?


0 commentaires

3 Réponses :


1
votes

Essayez de supprimer le rappel:

handler.removeCallbacksAndMessages(null);


2 commentaires

devrais-je changer ma méthode en tant que public Handler startScanning () {... ... return handler; } ?


@ raff5184 non, déclarez simplement le gestionnaire comme variable globale et initialisez-le dans la méthode. et avant de supprimer les rappels, il suffit de vérifier si (handler! = null)



1
votes
handler.removeCallbacksAndMessages(null);

0 commentaires

0
votes

J'ai une autre question sur ce problème. J'ai une méthode m () dans ma partie "séquentielle" du code, pas dans la partie asynchrone, que je n'ai besoin d'appeler que si le handler.removeCallbacksAndMessages (null); < / code> est appelé, ou après l'expiration de SCAN_PERIOD . Comment puis-je vérifier ces conditions et attendre essentiellement que l'une des deux se produise? Dois-je mettre m () dans une exécution synchrone? (Maintenant, j'ai aussi le handler global que je peux utiliser)


0 commentaires