2 回答
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
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
添加回答
举报