如何避免调用handler.postDelayed(Runnable run)?

时间:2019-10-11 12:29:05

标签: java android-studio asynchronous bluetooth-lowenergy postdelayed

我有这种方法可以扫描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)。因此,我不想在SCAN_PERIOD之后调用stopScan,否则我将调用两次。如何避免第二次通话?

3 个答案:

答案 0 :(得分:1)

尝试删除回叫:

handler.removeCallbacksAndMessages(null);

答案 1 :(得分:1)

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

答案 2 :(得分:0)

关于这个问题,我还有另一个问题。 我在代码的“顺序”部分中有一个方法m(),在异步部分中没有,只在调用handler.removeCallbacksAndMessages(null);或在SCAN_PERIOD之后才需要调用方法已过期。如何检查这些条件并基本上等待两种情况之一发生?我需要将m()放在同步run中吗? (现在,我也可以使用全局handler