Как избежать вложенных обратных вызовов в RxJava? - PullRequest
0 голосов
/ 09 июня 2018

Я использую библиотеку Реактивная сеть для Android.Я абсолютный новичок в 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 были бы полезны.

1 Ответ

0 голосов
/ 09 июня 2018

вы можете отфильтровать Connectivity.state и следующий оператор использования плоской карты преобразовать наблюдаемый в 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()
...