我有这种方法可以扫描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,否则我将调用两次。如何避免第二次通话?
答案 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
)