如何使用 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()
时,它 return 是一个 BehaviorSubject
,它将从调用 class
在方法 disconnect()
上,如果 BehaviorSubject
中没有观察者,它只会真正断开连接,表明没有 Activity 正在等待响应。
调用class必须在调用disconnect()
之前处理Observable,否则方法hasObservers()
永远不会returnfalse
@CheckResult
@Override
public BehaviorSubject<Boolean> connect() {
if (!connectionManager.isConnected()) {
connectionManager.connect(TIMEOUT);
}
return mSubject;
}
@Override
public void disconnect() {
if (connectionManager.isConnected() && !mSubject.hasObservers()){
connectionManager.disconnect();
}
}
在我之前的实现中,我使用监听器来实现这一点。每次调用 connect()
时,它必须接收监听器作为参数,该监听器将添加到监听器数组中,稍后在建立连接时一一通知。
并且每次调用 disconnect()
时,它还必须接收侦听器作为要从列表中删除的参数。 connectionManager.disconnect()
只有在侦听器数组为空时才会调用,表示没有 Activity 正在等待响应。
有没有更好的方法来处理这个问题?
在您创建主题的位置,您可以指定当某人 subscribes/unsubscribes:
时需要发生的事情
subject.doOnUnsubscribe(()-> {
if(!subject.hasObservers()) {
closeConnection();
}
});
subject.doOnSubscribe(() -> {
openConnectionIfNotOpen();
});
这样,您就可以摆脱disconnect()
电话,您只需要退订
在我的应用程序中,一些活动从服务器获取信息,我需要确保在尝试检索数据之前已经建立了连接。我正在使用 BehaviorSubject 在建立连接时通知订阅者,因此 Activity 可以加载数据。
问题是同一流程中的多个 activity 具有相同的行为。在我们的 API 中,我们必须在 onStart()
中调用 connect()
并在 onStop
中调用 disconnect()
,但是如果用户去另一个 Activity 也使用连接,无需重新创建连接,我们可以使用相同的连接。
目前,我的实现方式如下:
当您调用
connect()
时,它 return 是一个BehaviorSubject
,它将从调用 class在方法
disconnect()
上,如果BehaviorSubject
中没有观察者,它只会真正断开连接,表明没有 Activity 正在等待响应。调用class必须在调用
disconnect()
之前处理Observable,否则方法hasObservers()
永远不会returnfalse
@CheckResult @Override public BehaviorSubject<Boolean> connect() { if (!connectionManager.isConnected()) { connectionManager.connect(TIMEOUT); } return mSubject; } @Override public void disconnect() { if (connectionManager.isConnected() && !mSubject.hasObservers()){ connectionManager.disconnect(); } }
在我之前的实现中,我使用监听器来实现这一点。每次调用 connect()
时,它必须接收监听器作为参数,该监听器将添加到监听器数组中,稍后在建立连接时一一通知。
并且每次调用 disconnect()
时,它还必须接收侦听器作为要从列表中删除的参数。 connectionManager.disconnect()
只有在侦听器数组为空时才会调用,表示没有 Activity 正在等待响应。
有没有更好的方法来处理这个问题?
在您创建主题的位置,您可以指定当某人 subscribes/unsubscribes:
时需要发生的事情subject.doOnUnsubscribe(()-> {
if(!subject.hasObservers()) {
closeConnection();
}
});
subject.doOnSubscribe(() -> {
openConnectionIfNotOpen();
});
这样,您就可以摆脱disconnect()
电话,您只需要退订