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?
3 Réponses :
Essayez de supprimer le rappel:
handler.removeCallbacksAndMessages(null);
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)
handler.removeCallbacksAndMessages(null);
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)