在尝试编写一段负责发现蓝牙设备的代码时,我遇到了一个非常令人沮丧的问题。
根据Android Studio,这段代码是正确的:
fun discoverDevices(): Observable<BluetoothDevice> {
val discovered: HashSet<BluetoothDevice> = HashSet()
return bluetoothUtil.startDiscovery()
.flatMapObservable { discoveryStarted ->
if(discoveryStarted) {
RxBroadcastReceiver.create(appContext, IntentFilter().apply {
addAction(BluetoothDevice.ACTION_FOUND)
addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)
})
} else {
Observable.error(Throwable("Discovery couldn't be started"))
}
}
.takeUntil { intent ->
intent.action == BluetoothAdapter.ACTION_DISCOVERY_FINISHED
}
.map { intent ->
var bluetoothDevice: BluetoothDevice? = null
if(intent.action == BluetoothDevice.ACTION_FOUND) {
bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
}
if(bluetoothDevice != null && !discovered.contains(bluetoothDevice))
bluetoothDevice
else
null
}
}
该函数声明它返回Observable<BluetoothDevice>
,即使地图函数显然会返回BluetoothDevice?
。此外,我尝试通过附加
.filter {
it != null
}
到链的末尾,条件it != null
突出显示为&#34;始终为真&#34;并且返回值突然变为Observable<BluetoothDevice?>
。这令人非常沮丧,我似乎无法找到解决这个奇怪问题的方法。
这是Android Studio的错误还是我做错了什么?
答案 0 :(得分:4)
这有一个非常简单的解释:RxJava2中null
值不。
使用null
会在运行时抛出NullPointerException
,如下所述:What's different in 2.0。
在您的特定情况下,IDE会将表达式突出显示为&#34;始终为true&#34;因为RxJava2运营商不支持可空类型,所以它永远不会发出一个。