如何使用 Rx 管理多个观察者,以便仅保持一个与服务的打开连接?

How to use Rx to manage multiple observers in order to keep only one open connection to a service?

在我的应用程序中,一些活动从服务器获取信息,我需要确保在尝试检索数据之前已经建立了连接。我正在使用 BehaviorSubject 在建立连接时通知订阅者,因此 Activity 可以加载数据。

问题是同一流程中的多个 activity 具有相同的行为。在我们的 API 中,我们必须在 onStart() 中调用 connect() 并在 onStop 中调用 disconnect(),但是如果用户去另一个 Activity 也使用连接,无需重新创建连接,我们可以使用相同的连接。

目前,我的实现方式如下:

在我之前的实现中,我使用监听器来实现这一点。每次调用 connect() 时,它必须接收监听器作为参数,该监听器将添加到监听器数组中,稍后在建立连接时一一通知。

并且每次调用 disconnect() 时,它还必须接收侦听器作为要从列表中删除的参数。 connectionManager.disconnect() 只有在侦听器数组为空时才会调用,表示没有 Activity 正在等待响应。

有没有更好的方法来处理这个问题?

在您创建主题的位置,您可以指定当某人 subscribes/unsubscribes:

时需要发生的事情
subject.doOnUnsubscribe(()-> {
  if(!subject.hasObservers()) {
    closeConnection();
  }
});
subject.doOnSubscribe(() -> {
  openConnectionIfNotOpen();
});

这样,您就可以摆脱disconnect()电话,您只需要退订