В соответствии с документацией groupBy
:группеПо, фильтр и утечка памяти в Rx
Примечание:
GroupedObservable
будет кэшировать элементы это не испускать до тех пор, пока он подписан. По этой причине, чтобы избежать утечек памяти, вы не должны просто игнорировать теGroupedObservable
, которые вас не интересуют. Вместо этого вы можете сообщить им, что они могут сбросить свои буферы, применив к ним оператора, например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
, но может быть где угодно в цепочке и включать более сложные условия.
скорректировал этот ответ, чтобы включить предложение от @akarnokd о ignoreElements. –
Этот код не компилируется, потому что 'g.ignoreElements()' возвращает 'Completable'. Любые мысли о том, как с этим бороться? –
Выяснил это. Просто верните g.ignoreElements(). ToObservable(); ' –