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

How do I avoid a handler.postDelayed(Runnable run) from being called?

我有这种扫描蓝牙 LE 设备的方法。 scanner异步运行10s后中断

 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 ,否则我会调用它两次。如何避免第二次调用?

尝试删除回调:

handler.removeCallbacksAndMessages(null);
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);

关于这个问题我还有一个问题。 我在代码的 "sequential" 部分有一个方法 m(),不在异步代码中,只有在调用 handler.removeCallbacksAndMessages(null); 或在 [=12] 之后我才需要调用它=] 已过期。我如何检查这些条件并基本上等待两者之一发生?我是否需要将 m() 放入同步 run 中? (现在我也有了可以使用的全局handler