Подписаться условно на rxJava2 Observable - PullRequest
0 голосов
/ 05 марта 2019

У меня есть наблюдаемая rxJava2, на которую я хочу подписаться условно.В сценарии я сделаю сетевой вызов, а subscribe() вызывается только тогда, когда устройство подключено к сети. Я хочу сделать что-то вроде ниже

     observable. 
     subsribeWhenConditionIsMet(

   if (connected to internet) {
      mPresentation.showNetworkError();
      return;
    }

   subscribe();
  }
)

Есть предложения о том, как это сделать?Есть ли лучшие подходы?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Пока такого метода нет в RxJava2.Но если вы используете kotlin, вы можете сделать это, используя функцию расширения .Объявите это, как показано ниже.

fun <T> Observable<T>.subscribeIf(predicate: () -> Boolean) {
    if (predicate()) {
        subscribe()
    }
}

Во время вызова:

anyObservable()
    .subscribeIf { isConnectedToInternet() }

Extra

В случае, если вы хотите обработать откатВ этом случае вы можете написать свое расширение, как показано ниже, и сделать запасную лямбду необязательной, чтобы мы могли опустить ее, если не требуется.

fun <T> Observable<T>.subscribeIf(predicate: () -> Boolean, fallback: () -> Unit = {}) {
    if (predicate()) {
        subscribe()
    } else {
        fallback()
    }
}

Во время вызова:

anyObservable()
    .subscribeIf(
        predicate = { isConnectedToInternet() },
        fallback = { showError() }
    )
}

Примечание: Вы также можете позвонить с Java, перейдите по этой ссылке https://stackoverflow.com/a/28364983/3544839

0 голосов
/ 05 марта 2019

Наличие доступа к Интернету - это больше, чем простое условие, если вы думаете об этом, это больше похоже на поток логических значений, иногда это правда, иногда это ложно.

То, что вы хотите, - это создать Observable, который запускаетистина, когда интернет-соединение становится доступным.Если вы работаете на Android, у вас может быть BehaviourSubject в вещательном приемнике

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {
        final ConnectivityManager connMgr = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        final android.net.NetworkInfo wifi = connMgr
                .getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        final android.net.NetworkInfo mobile = connMgr
                .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        boolean hasInternet = wifi.isAvailable() || mobile.isAvailable()
        subject.onNext(hasInternet);
    }
}

Вам все равно нужно как-то передать объект вашему вещательному приемнику, но это не должно иметь большого значения.

Тогда, чтобы подписаться на свою заметку только тогда, когда эта тема вернет true, вы можете сделать это так:

 subject
                .filter(hasInternet ->
                        hasInternet // Don't continue if hasInternet is false
                )
                .flatMap(o ->
                        yourObservable // At this point, return the observable cause we have internet
                )
                .subscribe() // subscribe
...