【问题标题】:How do I avoid a handler.postDelayed(Runnable run) from being called?如何避免调用 handler.postDelayed(Runnable run)?
【发布时间】:2019-10-11 12:29:05
【问题描述】:

我有这种方法来扫描蓝牙 LE 设备。扫描仪异步运行 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,否则我会调用它两次。如何避免第二次调用?

【问题讨论】:

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


    【解决方案1】:

    尝试移除回调:

    handler.removeCallbacksAndMessages(null);
    

    【讨论】:

    • 我应该将我的方法更改为public Handler startScanning() { ... ... return handler; } 吗?
    • @raff5184 不,只需将处理程序声明为全局变量并在方法中对其进行初始化。在删除回调之前,只需检查 if(handler!= null)
    【解决方案2】:
    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);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多