如何避免 RxJava 中的嵌套回调?

Roy*_*son 0 android kotlin rx-java rx-java2

我正在使用Android 的Reactive Network库。我是 RxJava 的绝对初学者,我正在努力解决它。我想做的是:

1]持续观察手机网络连接状态的变化

2]如果手机已连接到网络,请检查一次是否有互联网连接

为此,我在 Kotlin 中有以下代码:

    ReactiveNetwork.observeNetworkConnectivity(applicationContext)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe { connectivity ->
                if (connectivity.state == NetworkInfo.State.CONNECTED) {
                    ReactiveNetwork.checkInternetConnectivity()
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe { isConnectedToInternet ->
                                if (isConnectedToInternet) {
                                    Log.d("VED-APP", "Connected to Internet")
                                } else {
                                    Log.d("VED-APP", "Not Connected to Internet")
                                }
                            }
                } 
            }
Run Code Online (Sandbox Code Playgroud)

然而,这段代码很丑陋,而且非常嵌套。有没有办法清理这段代码?

尽管示例是 Kotlin 中的,但 Java 或 Kotlin 中的答案都会有所帮助。

Ala*_*ang 5

您可以过滤connectivity.state,然后使用flatmap operator 将observable 转换为ReactiveNetwork.checkInternetConnectivity()。如 :

ReactiveNetwork.observeNetworkConnectivity(applicationContext)
        .subscribeOn(Schedulers.io())
        .filter{it.state == NetworkInfo.State.CONNECTED}
        .flatMapSingle{ReactiveNetwork.checkInternetConnectivity()}
        .observeOn(AndroidSchedulers.mainThread())
        .doOnNext{
             if (it) {
                Log.d("VED-APP", "Connected to Internet")
             } else {
                Log.d("VED-APP", "Not Connected to Internet")
             }
         }
         .subscribe()
Run Code Online (Sandbox Code Playgroud)

  • 将 `.flatMap{ReactiveNetwork.checkInternetConnectivity()}` 更改为 `.flatMapSingle { ...` 因为 `checkInternetConnectivity()` 产生一个 `Single` 而不是上游处理的 `Observable` (2认同)
  • 您可以尝试在过滤器旁边使用 switchIfEmpty(t -> Log.d("VED-APP", "Not Connected to Internet"))。如果过滤器返回空,则将打印此日志。 (2认同)