如何在flatMap链中正确完成Completable?

时间:2017-07-27 11:04:19

标签: android rx-java reactive-programming rx-android rx-java2

我有连接远程服务的任务。当它没有连接时 - 启动整个连接程序,如果已连接 - 只需完成。为此,我写了这个方法 -

public Completable execute() {
        return fptrService.isConnected()
            .flatMap(isConnected -> {
                if (isConnected) return Single.never();
                else return bluetoothService.isBluetoothAvailable();
            })
            .flatMap(isAvailable -> {
                if (isAvailable) return bluetoothService.isBluetoothActivated();
                else throw new BluetoothNotAvailableException();
            })
            .flatMap(isActivated -> {
                if (isActivated) return bluetoothService.searchForFptr();
                else throw new BluetoothNotActivatedException();
            })
            .flatMapCompletable(fptrService::connect);
    }

在第一种情况下,当没有连接服务时 - 一切正常。但是如果在第一阶段isConnected()返回TRUE所有链停顿并且Completable完全没有完成。我该怎么做才能在第一阶段强制完成?

1 个答案:

答案 0 :(得分:0)


    .flatMap(isConnected -> {
        if (isConnected) return Single.never();
        else return bluetoothService.isBluetoothAvailable();
    })  

你告诉我的是,如果isConnectedtrue,那么永远不会发出一个项目,因此这个可观察的内容永远不会终止。

相反,您应该向下游传递Single of false


    .flatMap(isConnected -> {
        if (isConnected) return Single.just(Boolean.FALSE);
        else return bluetoothService.isBluetoothAvailable();
    })
    // Will continue stream if `isConnected` is true
    .filter(isConnected -> isConnected)
    // if `isConnected` is false, then downstream operators won't be executed