Как избежать вызова handler.postDelayed (Runnable run)? - PullRequest
1 голос
/ 11 октября 2019

У меня есть этот метод для сканирования устройств Bluetooth LE. Сканер работает асинхронно в течение 10 секунд, а затем прерывается.

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

Однако, в зависимости от условия, которое проверяется во время сканирования (например, я нахожу устройство, которое искал и т. Д.),Я звоню btScanner.stopScan(leScanCallback). Поэтому я не хочу вызывать stopScan после SCAN_PERIOD, иначе я бы позвонил дважды. Как мне избежать второго звонка?

Ответы [ 3 ]

1 голос
/ 11 октября 2019
Handler handler = new Handler();

Runnable runnableRunner = new Runnable() {
    @Override
    public void run() {
        btScanner.stopScan(leScanCallback);
    }
 }

public void startScanning() {
  final long SCAN_PERIOD = 10000;
  handler.postDelayed(runnableRunner, SCAN_PERIOD);
  btScanner.startScan(leScanCallback);
}

Использование removeCallbacks удаляет все ожидающие сообщения Runnable r, которые находятся в очереди сообщений.

// cancel runnable whenever your condition is met.
handler.removeCallbacks(runnableRunner);

или используется для удаления всех сообщений и обратных вызовов

handler.removeCallbacksAndMessages(null);
1 голос
/ 11 октября 2019

Попробуйте убрать обратный звонок:

handler.removeCallbacksAndMessages(null);
0 голосов
/ 11 октября 2019

У меня есть еще один вопрос по этой проблеме. У меня есть метод m() в моей «последовательной» части кода, а не в асинхронном, который мне нужно вызывать, только если вызывается либо handler.removeCallbacksAndMessages(null);, либо после истечения срока действия SCAN_PERIOD. Как я проверяю эти условия и в основном жду, что произойдет одно из двух? Нужно ли ставить m() в синхронном run? (Теперь у меня также есть глобальный handler, который я могу использовать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...