【问题标题】:How to avoid nested callbacks in RxJava?如何避免 RxJava 中的嵌套回调?
【发布时间】:2018-06-09 01:54:20
【问题描述】:

我正在为 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")
                                }
                            }
                } 
            }

但是,这段代码很难看,而且非常嵌套。有没有办法清理这段代码?

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

【问题讨论】:

    标签: android kotlin rx-java rx-java2


    【解决方案1】:

    您可以过滤connectivity.state,然后使用flatmap 运算符将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()
    

    【讨论】:

    • 我尝试了您的解决方案,但在.flatMap{ReactiveNetwork.checkInternetConnectivity()} 行出现错误我用屏幕截图更新了我的帖子。
    • .flatMap{ReactiveNetwork.checkInternetConnectivity()} 更改为.flatMapSingle { ...,因为checkInternetConnectivity() 生成Single,而不是上游处理的Observable
    • @Alan Wang,我知道这超出了原始问题的范围,所以请随意不回答,但如果it.state 等于@,是否有办法也调用Log.d("VED-APP", "Not Connected to Internet") 987654330@
    • @Roymunson 我认为您可以在过滤器之前使用 doOnNext 运算符记录它,或者在过滤器中记录它然后返回 false 或 true。
    • 您可以尝试在过滤器旁边使用 switchIfEmpty(t -> Log.d("VED-APP", "Not Connected to Internet"))。如果过滤器返回空,则将打印此日志。
    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2021-02-26
    • 2012-10-05
    • 2013-01-04
    相关资源
    最近更新 更多