为了账号安全,请及时绑定邮箱和手机立即绑定

有条件地订阅 rxJava2 Observable

有条件地订阅 rxJava2 Observable

MYYA 2022-07-20 10:24:48
我有一个 rxJava2 Observable,我想有条件地订阅它。我将进行网络调用的场景,并且subscribe()仅在设备连接到网络时才调用。我想做如下的事情     observable.      subsribeWhenConditionIsMet(   if (connected to internet) {      mPresentation.showNetworkError();      return;    }   subscribe();  })关于如何做到这一点的任何建议?有没有更好的方法可用?
查看完整描述

2 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

目前在 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


查看完整回答
反对 回复 2022-07-20
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

拥有互联网接入不仅仅是一个简单的条件,如果你仔细想想,它更像是一个布尔值流,有时是真的,有时是假的。


您想要的是创建一个可在 Internet 连接可用时触发的 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 时订阅您的 observable,您可以这样做:


 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


查看完整回答
反对 回复 2022-07-20
  • 2 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信