繁体   English   中英

有条件地订阅rxJava2 Observable

[英]Subscribe Conditionally to rxJava2 Observable

我有一个rxJava2 Observable,我想有条件地订阅。 我将进行网络呼叫的情况,仅当设备连接到网络时才调用subscribe()想做下面的事情

     observable. 
     subsribeWhenConditionIsMet(

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

   subscribe();
  }
)

有关如何执行此操作的任何建议? 有更好的方法吗?

目前,RxJava2中没有此类方法可用。 但是,如果您使用的是kotlin,则可以使用扩展功能 像下面这样声明。

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

致电时:

anyObservable()
    .subscribeIf { isConnectedToInternet() }

额外

如果您想处理后备情况,可以像下面这样编写扩展名,并将后备lambda设为可选,以便我们在不需要时可以省略它。

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

拥有互联网不只是一个简单的条件,如果您考虑一下,它更像是一堆布尔值,有时是真实的,有时是错误的。

您想要的是创建一个Observable,当Internet连接可用时将触发true。 如果您使用的是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM