有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何避免处理程序。被调用后延迟(可运行运行)?

我有这个方法来扫描蓝牙设备。扫描仪异步运行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) 个答案

  1. # 1 楼答案

    尝试删除回拨:

    handler.removeCallbacksAndMessages(null);
    
  2. # 2 楼答案

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

  3. # 3 楼答案

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

    UseremoveCallbacks删除消息队列中任何挂起的Runnable r帖子

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

    或用于删除所有消息和回调

    handler.removeCallbacksAndMessages(null);