如何在RxAndroidBle中设置10秒的扫描超时?
在RxAndroidBle中设置10秒扫描超时的方案
嘿,这事儿好办!要给RxAndroidBle的扫描加10秒超时,用RxJava的操作符就能轻松实现,我给你两种常用的方案,你看哪种适合你的场景:
方案一:用take()直接指定扫描时长(最简洁)
这个方法会让扫描Observable在10秒后自动发送onComplete信号,RxAndroidBle会自动停止扫描,非常直观:
scanDisposable = rxBleClient.scanBleDevices( new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) .build(), new ScanFilter.Builder() .setDeviceAddress("B4:99:4C:34:DC:8B") .build() ) // 核心:添加10秒超时,到点自动结束扫描 .take(10, TimeUnit.SECONDS) .observeOn(AndroidSchedulers.mainThread()) .doFinally(this::dispose) .subscribe( resultsAdapter::addScanResult, throwable -> { // 处理扫描过程中的错误(比如蓝牙未开启等) if (throwable instanceof RxBleScanException) { // 这里可以针对性处理扫描异常 } }, () -> { // 扫描正常结束(包括10秒超时结束) // 可以在这里给用户提示,比如"扫描已结束" } );
方案二:用takeUntil()结合timer()(更灵活)
如果你需要在超时前做一些额外逻辑,或者想更精准控制超时触发时机,可以用这个方案:
scanDisposable = rxBleClient.scanBleDevices( new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) .build(), new ScanFilter.Builder() .setDeviceAddress("B4:99:4C:34:DC:8B") .build() ) // 当timer在10秒后发射数据时,立即停止扫描 .takeUntil(Observable.timer(10, TimeUnit.SECONDS)) .observeOn(AndroidSchedulers.mainThread()) .doFinally(this::dispose) .subscribe( resultsAdapter::addScanResult, throwable -> { // 处理扫描错误 }, () -> { // 扫描结束回调 } );
注意点
- 你已经添加的
doFinally(this::dispose)非常关键,它会在扫描结束(不管是超时完成、错误终止还是手动停止)时自动释放资源,避免内存泄漏。 - 如果需要区分“超时结束”和“找到目标设备后手动停止”,可以在
onComplete回调里做额外判断,或者给timer的发射数据加标记。
内容的提问来源于stack exchange,提问作者kosancicivan
相关产品推荐
相关产品推荐

