如何解决RxAndroidBle 2订阅了Kotlin中的两个不同特征
很抱歉,如果这是一个重复的问题,我在任何地方都找不到有用的答案。我也是反应式编程的初学者,因此对于一些愚蠢的问题,我表示抱歉。
我在Kotlin Android应用中使用rxandroidble2。如果我只想读取一个特征,则可以成功连接到BLE设备。但是,我无法将其用于连接两个单独的特征。
特征A每两秒钟发送一次数据包。特征B每秒发送多次数据包。如果单独进行操作,则可以连接到这两个应用程序,即仅针对CharA或CharB建立连接来运行该应用程序。
我尝试过的解决方案全部来自stackoverflow,特别是我尝试过:
- RxAndroidBle Multiple Characteristic Notifications and Read/Write
- Read multiple characteristics from an Android device using library RxAndroidBle
- https://github.com/Polidea/RxAndroidBle/issues/61
- RxAndroidBle crash on subscribe to multiple characteristics
我的代码是这样的:
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,"processed second packet")
},{
Log.i("ble","error when connecting = " + it.stackTrace)
})
Log.i("ble","does this mean connection is over")
我有几个问题:
- subscribe方法接收类型为Pair
的对象。当我尝试获取对象对中的对象时,它们以可观察的形式返回,而我设法获取可观察的值的唯一方法是调用blockingFirst()。显然,这不是一个好的解决方案,因为我的代码无法运行。 - 我无法让BiFunction返回一对ByteArray而不是Observable。
- 如果我注释掉processRESpeckPacket行并仅保留日志,则它们仅运行一次,这使我认为值更改通知不起作用。
- 我也在Java中尝试了以上大多数解决方案,并且得到了相同的行为。我链接到的stackoverflow答案中没有解释rxandroidble2中的某些更改吗?
- 我的特征发送频率不同会导致所有问题吗?
请帮助我,我永远都被这个困扰!如何在Kotlin中使用它?
非常感谢。
解决方法
我的特征以不同的频率发送会导致所有问题吗?
是的。 Observable<ByteArray>
发出的setupNotification()
是热门的Observable
,无论您是否收听,它都会发出声音-与广播一样。使用.blocking*()
运算符会阻塞您的侦听线程,如果其他Observable
在阻塞时间内发出,您会错过它。
我也在Java中尝试了上面的大多数解决方案,并且得到了相同的行为。我链接到的stackoverflow答案中没有解释rxandroidble2中有什么变化吗?
RxJava 1和2之间的更改大部分是表面上的,在适当的地方从Observable
更改为Single
或Completable
。一些操作员被删除或更改了名称,但情况并非如此。
如果您只需要两个特征都发出的最新值,则可以使用如下代码:
respeckLiveSubscription = connectionObservable?.flatMap{
Observable.combineLatest(
it.setupNotification(UUID.fromString(Constants.CHARACTERISTIC_A_UUID)).flatMap { it },// notice flatMap
it.setupNotification(UUID.fromString(Constants.CHARACTERISTIC_B_UUID)).flatMap { it },// notice flatMap
io.reactivex.functions.BiFunction<ByteArray,ByteArray,Pair<ByteArray,ByteArray>> {
t1,t2 -> Pair.create(t1,t2) // now we have 'ByteArray's here,not 'Observable<ByteArray>'s
}
)
}?.subscribe({
processRESpeckPacket(it.first,respeckVersion,this)
Log.i("ble","processed first value")
processRESpeckPacket(it.second,7,"processed second value")
},{
Log.i("ble","error when connecting = " + it.stackTrace)
})
Log.i("ble","does this mean connection is over") // no it is only subscribed
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。