我有一个rxJava2 Observable,我想有条件地订阅。
我将进行网络呼叫,而subscribe()
仅在设备连接到网络时才被调用。我想做以下类似的事情
observable.
subsribeWhenConditionIsMet(
if (connected to internet) {
mPresentation.showNetworkError();
return;
}
subscribe();
}
)
有关如何执行此操作的任何建议?有更好的方法吗?
答案 0 :(得分:2)
目前,RxJava2中没有此类方法可用。但是,如果您使用的是Kotlin,则可以使用扩展功能来完成。像下面这样声明它。
anyObservable()
.subscribeIf { isConnectedToInternet() }
通话时:
fun <T> Observable<T>.subscribeIf(predicate: () -> Boolean, fallback: () -> Unit = {}) {
if (predicate()) {
subscribe()
} else {
fallback()
}
}
额外
如果要处理后备情况,可以像下面这样编写扩展名,并将后备lambda设为可选,以便我们在不需要时可以省略它。
anyObservable()
.subscribeIf(
predicate = { isConnectedToInternet() },
fallback = { showError() }
)
}
通话时:
{{1}}
注意:您也可以从Java调用它,请参考此链接https://stackoverflow.com/a/28364983/3544839
答案 1 :(得分:0)
拥有互联网不仅仅是一个简单的条件,如果您考虑一下,它更像是一堆布尔值,有时是真实的,有时是错误的。
您想要的是创建一个Observable,当Internet连接可用时将其触发。 如果您使用的是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