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)