首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxAndroidBle:独立订阅者

RxAndroidBle:独立订阅者
EN

Stack Overflow用户
提问于 2018-08-09 11:03:10
回答 2查看 157关注 0票数 0

我是RxJava和RxAndroidBle的新手,如果您能帮助我解决正在尝试解决的问题,我将不胜感激。基本上,我有一个BLE设备,我订阅了四个特征。从这些可观察对象发出的数据被组合成一个可观察对象:

代码语言:javascript
复制
private RxBleDevice mBleDevice;
private Disposable mConnectionSubscription;

...

mConnectionSubscription = mBleDevice.establishConnection(false)
        .flatMap(rxBleConnection -> Observable.combineLatest(
                rxBleConnection.setupNotification(UUID.fromString(CHARACTERISTIC_UUID0)).flatMap(observable -> observable),
                rxBleConnection.setupNotification(UUID.fromString(CHARACTERISTIC_UUID1)).flatMap(observable -> observable),
                rxBleConnection.setupNotification(UUID.fromString(CHARACTERISTIC_UUID2)).flatMap(observable -> observable),
                rxBleConnection.setupNotification(UUID.fromString(CHARACTERISTIC_UUID3)).flatMap(observable -> observable),
                MyDataClass::new
        ))
        .observeOn(AndroidSchedulers.mainThread())
        .doFinally(this::disconnect)
        .subscribe(
                myData -> {
                    this.onNotificationReceived(myData);
                },
                this::onNotificationSetupFailure
        );

其中:

代码语言:javascript
复制
public class MyDataClass<Data0, Data1, Data2, Data3> {
    ...

    public MyDataClass(Data0 data0, Data1 data1, Data2 data2, Data3 data3) {
        ...
    }
}

上面的方法运行良好。我想要做的是订阅另一个特征。然而,这只是时不时地发出数据。因此,我想将这个额外的观察值连接到一个单独的观察者(比如onNotificationReceived2)。我不希望这些额外的可观察数据与MyDataClass相关。我该怎么做呢?

EN

回答 2

Stack Overflow用户

发布于 2018-08-19 23:19:07

在您的flatMap()之前插入:.doOnNext( rxBleConnection -> savedConnection = rxBleConnection ),然后使用savedConnection设置您的其他订阅。

当您处理(或丢失)原始连接时,不要忘记将savedConnection设为空。

票数 0
EN

Stack Overflow用户

发布于 2018-09-07 11:15:35

我找到了我想要的解决方案。根据this issue和Robert Lewis的评论,我最终做了以下事情:

代码语言:javascript
复制
private RxBleDevice mBleDevice;
private Disposable mConnectionSubscription1;
private Disposable mConnectionSubscription2;

...

Observable<RxBleConnection> sharedConnectionObservable = mBleDevice.establishConnection(false)
        .replay(1).refCount();

mConnectionSubscription1 = sharedConnectionObservable
        .flatMap(rxBleConnection -> Observable.combineLatest(
                rxBleConnection.setupNotification(UUID.fromString(CHARACTERISTIC_UUID0)).flatMap(observable -> observable),
                rxBleConnection.setupNotification(UUID.fromString(CHARACTERISTIC_UUID1)).flatMap(observable -> observable),
                rxBleConnection.setupNotification(UUID.fromString(CHARACTERISTIC_UUID2)).flatMap(observable -> observable),
                rxBleConnection.setupNotification(UUID.fromString(CHARACTERISTIC_UUID3)).flatMap(observable -> observable),
                MyDataClass::new
        ))
        .observeOn(AndroidSchedulers.mainThread())
        .doFinally(this::disconnect)
        .subscribe(
                myData -> {
                    this.onNotificationReceived(myData);
                },
                this::onNotificationSetupFailure
        );

mConnectionSubscription2 = sharedConnectionObservable
        .flatMap(rxBleConnection -> rxBleConnection.setupNotification(UUID.fromString(CHARACTERISTIC_UUID4)).flatMap(observable -> observable))
        .observeOn(AndroidSchedulers.mainThread())
        .doFinally(this::disconnect)
        .subscribe(
                myData2 -> {
                    this.onNotificationReceived2(myData2);
                },
                this::onNotificationSetupFailure
        );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51758218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档