如何避免调用 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
)
我有这种扫描蓝牙 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
)