在RxAndroidBle中,如何从Observable.comboLatest()中返回ObservableSource<out TypeVariable<R>!>!而不是Unit?

问题描述 投票:0回答:1

我试图从Observable.comboLatest()中获取所有特性。Device Information 服务。我可以选择任何一个设备,并使用它的特性。

                    deviceConnection =
                        device.establishConnection(true)
                            .flatMapSingle { rxBleConnection ->
                                rxBleConnection
                                    .readCharacteristic(java.util.UUID.fromString(c.uuid))
                            }
                            .subscribe(
                                { onConnectionSuccess(it, v) },
                                { onConnectionFailure(it, v) })

问题是当我试图一次读取多个特性时。我尝试使用 Polidea的博客详细介绍了多次阅读的情况。,关于SO的多个问题,以及RxJava观测值的文档,我无法找出我做错了什么。

我从AndroidStudio得到的错误是。

Type mismatch.
    Required: ObservableSource<out TypeVariable<R>!>!
    Found:    Unit

据我所知,我的做法和其他例子一样 我试图读取多个特性的代码如下。

device = BleApplication.getRxBleClient(this)
            .getBleDevice(macAddress)

        deviceConnection =
            device.establishConnection(false)
                .flatMap { rxBleConnection ->
                    Observable.combineLatest(
                        rxBleConnection
                            .readCharacteristic(jUuid(ManufacturerNameString.toString())),
                        rxBleConnection
                            .readCharacteristic(jUuid(ModelNumberString.toString())),
                        rxBleConnection
                            .readCharacteristic(jUuid(SerialNumberString.toString())),
                        rxBleConnection
                            .readCharacteristic(jUuid(HardwareRevisionString.toString())),
                        rxBleConnection
                            .readCharacteristic(jUuid(FirmwareRevisionString.toString())),
                        rxBleConnection
                            .readCharacteristic(jUuid(SoftwareRevisionString.toString())),
                        rxBleConnection
                            .readCharacteristic(jUuid(SystemID.toString())),
                        rxBleConnection
                            .readCharacteristic(jUuid(PnPID.toString())),
                        ::BoseDevice
                    )
                }
                .take(1)
                .subscribe({}, {}) //onConnectionSuccess(it) }, { onConnectionFailure(it) })

我试图将观测值输入的类:

internal class BoseDevice(
    val manufacturer: ByteArray,
    val modelNumber: ByteArray,
    val serialNumber: ByteArray,
    val hardwareRevision: ByteArray,
    val firmwareRevision: ByteArray,
    val softwareRevision: ByteArray,
    val systemID: ByteArray,
    val pnpID: ByteArray
)

这些是我在gradle文件中声明的依赖关系。

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation "com.polidea.rxandroidble2:rxandroidble:1.11.1"
    implementation 'com.google.android.material:material:1.1.0'
    implementation "io.reactivex.rxjava2:rxjava:2.2.19"
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
rx-java2 reactivex rxandroidble
1个回答
1
投票

这些类型的问题在Kotlin中是出了名的难以调试(至少现在是1.3.70)。首先 - 你试图 .combineLatest() 类型的对象 Single,不 Observable. 所以,你应该使用以下两种方法 .flatMapSingle() 结合 Single.zip() 或将每个读数改为 Observable 这样 rxBleConnection.readCharacteristic().toObservable(). 第二--你试图用构造函数作为一个 Function8 对象,显然不能这样使用。你必须手动创建这个函数

device.establishConnection(false)
    .flatMapSingle { rxBleConnection ->
        Single.zip(
            rxBleConnection
                .readCharacteristic(jUuid(ManufacturerNameString.toString())),
            rxBleConnection
                .readCharacteristic(jUuid(ModelNumberString.toString())),
            rxBleConnection
                .readCharacteristic(jUuid(SerialNumberString.toString())),
            rxBleConnection
                .readCharacteristic(jUuid(HardwareRevisionString.toString())),
            rxBleConnection
                .readCharacteristic(jUuid(FirmwareRevisionString.toString())),
            rxBleConnection
                .readCharacteristic(jUuid(SoftwareRevisionString.toString())),
            rxBleConnection
                .readCharacteristic(jUuid(SystemID.toString())),
            rxBleConnection
                .readCharacteristic(jUuid(PnPID.toString())),
            Function8 { a, b, c, d, e, f, g, h -> BoseDevice(a, b, c, d, e, f, g, h)}
        )
    }
    .take(1)
    .subscribe({}, {})

device.establishConnection(false)
    .flatMap { rxBleConnection ->
        Observable.combineLatest(
            rxBleConnection
                .readCharacteristic(jUuid(ManufacturerNameString.toString())).toObservable(),
            rxBleConnection
                .readCharacteristic(jUuid(ModelNumberString.toString())).toObservable(),
            rxBleConnection
                .readCharacteristic(jUuid(SerialNumberString.toString())).toObservable(),
            rxBleConnection
                .readCharacteristic(jUuid(HardwareRevisionString.toString())).toObservable(),
            rxBleConnection
                .readCharacteristic(jUuid(FirmwareRevisionString.toString())).toObservable(),
            rxBleConnection
                .readCharacteristic(jUuid(SoftwareRevisionString.toString())).toObservable(),
            rxBleConnection
                .readCharacteristic(jUuid(SystemID.toString())).toObservable(),
            rxBleConnection
                .readCharacteristic(jUuid(PnPID.toString())).toObservable(),
            Function8 { a, b, c, d, e, f, g, h -> BoseDevice(a, b, c, d, e, f, g, h)}
        )
    }
    .take(1)
    .subscribe({}, {})
© www.soinside.com 2019 - 2024. All rights reserved.