如何关闭CachedObservable

时间:2016-07-05 07:35:48

标签: android rx-java

我有无尽的流(根本没有被称为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();
    }
}

但反思不是好办法:(

1 个答案:

答案 0 :(得分:0)

找到解决方案:

运营商缓存的行为与运营商重播+ autoConnect(1)类似。

replay().autoConnect(1, toStop -> { /* store Subscription to cancel later */ });

让您通过订阅来停止上游。