我有无尽的流(根本没有被称为onComplete)。我在其中缓存了最后一个值:
Observable<T> endlessStream = createStream().cache();
Subscription s1 = endlessStream.subscribe(...)
Subscription s2 = endlessStream.subscribe(...)
某些条件endlessStream
变得无效,我将其替换(使用switchMap,但这并不重要)。
s1.unsubscribe()
s2.unsubscribe()
但是CachedObservable将始终存储与源流的连接(从createStream()
返回)。这会导致内存泄漏。
如何从源可观察性中断开CachedObservable
?
更多信息:
CachedObservable
包含字段state
,其中包含SerialSubscription以获取可观察对象(connection
)。
如果我打电话给下一个黑客,一切都会变好:
private void disconnectCachedObservable(CachedObservable<T> observable) {
try {
Field fieldState = CachedObservable.class.getDeclaredField("state");
fieldState.setAccessible(true);
Object state = fieldState.get(observable);
Field fieldConnection = state.getClass().getDeclaredField("connection");
fieldConnection.setAccessible(true);
SerialSubscription subscription = (SerialSubscription) fieldConnection.get(state);
subscription.unsubscribe();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
但反思不是好办法:(
答案 0 :(得分:0)
找到解决方案:
运营商缓存的行为与运营商重播+ autoConnect(1)类似。
replay().autoConnect(1, toStop -> { /* store Subscription to cancel later */ });
让您通过订阅来停止上游。