В RxAndroidBle, как вернуть ObservableSource ! из Observable.combineLatest () вместо Unit? - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь получить все характеристики от службы Device Information на конкретном c устройстве. Я могу выбрать любое отдельное устройство и получить от него характеристику c, используя:

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

Проблема заключается в том, что я пытаюсь прочитать несколько характеристик одновременно. Я попытался использовать пример документации из блога Polidea, в котором подробно описаны несколько операций чтения , несколько вопросов по SO и документация для наблюдаемых Rx Java, и я не могу понять, что я делаю не так.

Ошибка, которую я получаю от 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'

1 Ответ

1 голос
/ 31 мая 2020

Проблемы этого типа, как известно, трудно отладить с помощью 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({}, {})
...