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