繁体   English   中英

RXAndroid 编写嵌套订阅的更好方法

[英]RXAndroid better way to write nested subscriptions

我正在使用适用于 Android 的 RXBle 库。 为了从 BLE 外围设备(BLE 设备)中读取数据,我最终设置了多个订阅,所有订阅都在彼此内,如下所示:

    Disposable scanSubscription = null;

    public void startScan() {
        scanSubscription = rxBleClient
            .scanBleDevices(settings, filter)
            .take(1)
            .subscribe(
                scanResult -> connectDevice(scanResult.getBleDevice()),
                throwable -> {}
            );
    }

    public void connectDevice(RxBleDevice device) {
        device
            .establishConnection(false)
            .subscribe(
                connection -> requestMtu(connection),
                throwable -> {}
            );
    }

    public void requestMtu(final RxBleConnection connection) {
        connection
            .requestMtu(185)
            .subscribe(
                mtu -> readCharacteristic(connection),
                throwable -> {}
            );
    }

    public void readCharacteristic(final RxBleConnection connection) {
        /* this one eventually scanSubscription.dispose!!!!! */
    }

本质上,我有一系列函数可以对事物执行操作,然后订阅生成的 Single(我认为我正确使用了术语)

我的问题是,写这个的更好方法是什么?

更重要的是,我从未取消订阅的嵌套订阅会发生什么? 请注意,在第一个函数中,我正在调用 take(1)...最终我只处理调用所有这些的顶级一次性。

不,这不是 RX 方式。 我建议快速阅读一下

tl;dr 是您想要布置代码,使其像流一样流动。 Rx 试图解决的一件事是消除嵌套回调。 这种“流”方法就是这样做的。

现在看看你可以做些什么来让它变得更好。 这是重写代码的一种方法,使其成为流而不是一组嵌套回调:

Disposable scanSubscription = null;

public void doThing() {
    scanSubscription = rxBleClient
        .scanBleDevices(settings, filter)
        .take(1)
        .map(scanResult -> scanResult.establishConnection(false))
        .map(connection -> connection.requestMtu(185))
        .map(mtu -> <do thing>)
        .subscribe(/* do things with final value */)
}

这是另一种方法:

Disposable scanSubscription = null;

public void doThing() {
    scanSubscription = rxBleClient
        .scanBleDevices(settings, filter)
        .take(1)
        .flatMap(scanResult -> scanResult.establishConnection(false))
        .flatMap(connection -> connection.requestMtu(185).map(result -> Pair(connection, result)))
        .flatMap(result -> {
            Connection c = result.first;
            Mtu mtu = result.second;
            //do thing
        })
        .subscribe(/* do things with final value */)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM