RxAndroidBle 2在Kotlin中具有两种不同的特性

RxAndroidBle 2在Kotlin中具有两种不同的特性,android,kotlin,bluetooth-lowenergy,rxandroidble,Android,Kotlin,Bluetooth Lowenergy,Rxandroidble,很抱歉,如果这是一个重复的问题,我在任何地方都找不到有用的答案。我也是一个反应式编程的初学者,所以我为一些愚蠢的问题提前道歉 我正在Kotlin Android应用程序中使用rxandroidble2。如果我只想读取一个特征,我就可以成功连接到可编程设备。但是,我无法让它连接到两个单独的特性 特征A每两秒钟发送一次数据包。特征B每秒发送多次数据包。如果我单独连接,我可以同时连接到这两个应用程序,也就是说,运行应用程序时只需为CharA或CharB建立连接 我尝试过的解决方案都来自stackove

很抱歉,如果这是一个重复的问题,我在任何地方都找不到有用的答案。我也是一个反应式编程的初学者,所以我为一些愚蠢的问题提前道歉

我正在Kotlin Android应用程序中使用rxandroidble2。如果我只想读取一个特征,我就可以成功连接到可编程设备。但是,我无法让它连接到两个单独的特性

特征A每两秒钟发送一次数据包。特征B每秒发送多次数据包。如果我单独连接,我可以同时连接到这两个应用程序,也就是说,运行应用程序时只需为CharA或CharB建立连接

我尝试过的解决方案都来自stackoverflow,特别是我尝试过的:

我的代码是:

respeckLiveSubscription = connectionObservable?.flatMap{
            Observable.combineLatest(
                it.setupNotification(UUID.fromString(Constants.CHARACTERISTIC_A_UUID)),
                it.setupNotification(UUID.fromString(Constants.CHARACTERISTIC_B_UUID)),
                io.reactivex.functions.BiFunction<Observable<ByteArray>, Observable<ByteArray>, Pair<Observable<ByteArray>, Observable<ByteArray>>> {
                    t1, t2 -> Pair.create(t1, t2)
                }
            )
        }?.subscribe({
            processRESpeckPacket(it.first.blockingFirst(), respeckVersion, this)
            Log.i("ble", "processed first packet")
            processRESpeckPacket(it.second.blockingFirst(), 7, this)
            Log.i("ble", "processed second packet")
        },{
            Log.i("ble", "error when connecting = " + it.stackTrace)
        })

        Log.i("ble", "does this mean connection is over")
respeckLiveSubscription=connectionObservable?.flatMap{
可观察的(
it.setupNotification(UUID.fromString(Constants.CHARACTERISTIC\u A\u UUID)),
it.setupNotification(UUID.fromString(Constants.CHARACTERISTIC_B_UUID)),
io.reactivex.functions.BiFunction{
t1,t2->Pair.create(t1,t2)
}
)
}?订阅({
processRESpeckPacket(it.first.blockingFirst(),respeckVersion,this)
Log.i(“ble”,“处理的第一个数据包”)
processRESpeckPacket(it.second.blockingFirst(),7,this)
Log.i(“ble”,“已处理的第二个数据包”)
},{
Log.i(“ble”,“连接时出错=“+it.stackTrace”)
})
Log.i(“ble”,“这是否意味着连接已结束”)
我有几个问题:

  • subscribe方法接收类型为Pair的对象。当我尝试获取对象对中的对象时,它们将作为可观察对象返回,我获取可观察值的唯一方法是调用blockingFirst()。显然,这不是一个好的解决方案,因为我的代码没有运行
  • 我不能让双函数返回一对ByteArray而不是Observable
  • 如果我注释掉processRESpeckPacket行,只留下日志,它们只运行一次,这让我认为值更改通知不起作用
  • 我还用Java尝试了上面的大多数解决方案,我也得到了同样的效果。rxandroidble2中是否发生了我链接到的stackoverflow答案中没有解释的变化
  • 是我的特征以不同的频率发送的事实导致了所有的问题吗
请帮帮我,我一直都被这个困扰着!我怎样才能让它在科特林工作

非常感谢

是我的特征以不同的频率发送的事实导致了所有的问题吗

Observable
setupNotification()
发出是一个热门的
Observable
-无论您是否收听,它都会发出-与收音机一样。使用
.blocking*()
操作符会阻塞您的侦听线程,如果另一个
可观察的
会在阻塞时间内发出,您将错过它

我还用Java尝试了上面的大多数解决方案,我也得到了同样的效果。rxandroidble2中是否发生了我链接到的stackoverflow答案中没有解释的变化

RxJava 1和RxJava 2之间的变化主要是表面性的,从
可观察的
单一的
可完全的
(如适用)。有些操作员被删除或更改了姓名,但这不是您的情况

如果您只需要两个特征发出的最新值,则可以使用如下代码:

respeckLiveSubscription=connectionObservable?.flatMap{
可观察的(
setupNotification(UUID.fromString(Constants.CHARACTERISTIC_A_UUID)).flatMap{it},//注意flatMap
setupNotification(UUID.fromString(Constants.CHARACTERISTIC_B_UUID)).flatMap{it},//注意flatMap
io.reactivex.functions.BiFunction{
t1,t2->Pair.create(t1,t2)//现在我们有了‘ByteArray’在这里,而不是‘Observable’
}
)
}?订阅({
processRESpeckPacket(it.first,respeckVersion,this)
Log.i(“ble”,“处理的第一个值”)
processRESpeckPacket(it.second,7,this)
Log.i(“ble”,“已处理的第二个值”)
},{
Log.i(“ble”,“连接时出错=“+it.stackTrace”)
})
Log.i(“ble”,“这是否意味着连接已结束”)//不,它仅被订阅