当前位置: 首页 > 知识库问答 >
问题:

有条件地订阅rxJava2 Observable

吉泰宁
2023-03-14

我有一个rxJava2可观察对象,我想有条件地订阅它。场景i将进行网络调用,并且只有当设备连接到网络时才会调用subscribe()。我想做下面的事情

     observable. 
     subsribeWhenConditionIsMet(

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

   subscribe();
  }
)

有什么建议吗?有没有更好的办法?

共有2个答案

慕容兴贤
2023-03-14

上网不仅仅是一个简单的条件,如果你想一想,它更像是一连串布尔值,有时是真的,有时是假的。

您想要的是创建一个可观察的,当internet连接可用时激发true。如果你在Android系统上,你可以在广播接收器中设置一个行为主体

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
谢豪
2023-03-14

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

 类似资料:
  • Node.js应用程序可以使用composer-client.BusinessNetworkConnection.onAPI调用从业务网络订阅事件。事件在业务网络模型文件中定义,并由交易处理函数文件中的指定交易处理。有关发布事件的更多信息,请参阅发布事件。 在你开始之前 在应用程序可以订阅事件之前,你必须定义一些事件和发送它们的交易。还必须部署业务网络,并且必须具有可连接到该业务网络的连接配置文件

  •  说明 调用方法: $.f2eAct.yyue(el,options); 函数说明: Y阅功能,包含查询用户是否订阅,用户订阅,用户取消订阅 参数说明: 参数名 类型 说明 备注 el string DOM元素对象 必要 pcode int 订阅媒体的id 必要 gcode int 媒体用户分组id 必要 success function 查询是否订阅回调方法 无 confirm functio

  • 订阅指过滤表(table)的规则,Canal 客户端发送给客户端订阅规则,那么服务端将会推送符合规则的表数据过来,采用正则匹配。 允许所有表:.\*\\\\..\*

  • 问题内容: 我一直在尝试可以在网上找到的所有内容,但没有任何效果。希望大家能看到新的问题。这是我第一次使用ActionCable,在本地一切正常,但是当推送到heroku时。我的日志没有像我的开发服务器那样显示任何可操作的订阅: 在发送消息时,我确实看到了,但没有将它们追加,这是在猜测是否意味着未访问/调用该方法? 我确实在heroku的日志中注意到它说,开发人员正在localhost:3000监

  • 我正在使用条纹结账来处理结账表单。 我在前面做了一个“取消订阅”按钮(使用react.js),我正在发送api调用以按ID取消订阅。 已成功取消订阅,但未将款项退还给客户? 例如: 我今天(每月)订阅了,明天我想取消订阅? 29天或30天的钱应该退给我,对吧? 节点JS代码: 我在Stripe仪表板上看到,当我删除订阅时,货币值没有改变。 多谢了。

  • 我有一个BizSpark帐户,但我正在努力弄清楚作为我的免费Azure包的一部分,我实际上有权得到什么。套餐详情列于此处: http://www.windowsazure.com/en-us/offers/details?locale=en-us 我需要运行: 一个虚拟机(运行Linux)为网站供电 一个托管服务,为客户端软件(Windows Phone和Windows 8)提供数据库访问 一个托