【发布时间】:2015-11-25 21:55:29
【问题描述】:
根据groupBy的文档:
注意:
GroupedObservable将缓存它要发出的项目,直到它被订阅。因此,为了避免内存泄漏,您不应该简单地忽略那些与您无关的GroupedObservables。相反,您可以向他们发出信号,告知他们可能会通过对他们应用take(int)(0)之类的运算符来丢弃缓冲区。
有一个RxJava tutorial 说:
在内部,每个 Rx 操作员做 3 件事
- 它订阅源并观察值。
- 它根据操作员的目的转换观察到的序列。
- 它通过调用 onNext、onError 和 onCompleted 将修改后的序列推送给自己的订阅者。
让我们看看下面的代码块,它只从range(0, 10)中提取偶数:
Observable.range(0, 10)
.groupBy(i -> i % 2)
.filter(g -> g.getKey() % 2 == 0)
.flatMap(g -> g)
.subscribe(System.out::println, Throwable::printStackTrace);
我的问题是:
-
这是否意味着
filter运营商已经暗示订阅来自groupBy的每个组或只是Observable<GroupedObservable>一个? -
在这种情况下会不会出现内存泄漏?如果是这样,
-
如何正确丢弃这些组?将
filter替换为自定义的take(0),后跟return Observable.empty()?你可能会问我为什么不直接返回take(0):这是因为filter不一定紧跟在groupBy之后,而是可以在链中的任何位置并涉及更复杂的条件。
【问题讨论】:
标签: java memory-leaks reactive-programming rx-java reactivex