Каков вариант использования метода добавления подписчика ресурсов?

#rx-java

#rx-java

Вопрос:

Я не мог понять вариант использования add(Disposable) метода ResourceSubscriber.

Я подумал, что этот add(Disposable) метод может использоваться для удаления нескольких одноразовых файлов.

Однако, если я хочу объединить несколько подписок, я бы использовал CompositeSubscription и добавил одноразовые файлы из возвращаемого значения subscribeWith метода. Более того, я думаю, этот способ легче читать.

Кроме того, я подумал, что, когда основной поток будет завершен, дополнительный поток может быть удален автоматически, потому что завершенный поток может рассматриваться как удаляемый поток. Итак, я попробовал ниже.

 Flowable<Long> f1 = Flowable.interval(100L, TimeUnit.MILLISECONDS).take(3);
Flowable<Long> f2 = Flowable.interval(200L, TimeUnit.MILLISECONDS);

ResourceSubscriber<Long> s = new ResourceSubscriber<Long>() {
  ...
};

s.add(f2.subscribeWith(new DisposableSubscriber<Long>() {
  ...
}));

f1.subscribe(s);
  

Тем не менее, f2 продолжал работать после f1 завершения.
f2 не был удален.

Теперь мне интересно, каков был бы хороший вариант использования add(Disposable) метода ResourceSubscriber.

Ответ №1:

ResourceSubscriber позволяет регистрировать Disposable ресурсы, аналогичные тому, как Subscriber это разрешено 1.x, и существует для облегчения перехода от 1.x к 2.x . Однако он отслеживает только ресурсы, и вам нужно вручную вызвать dispose свою onError onComplete реализацию and, чтобы распорядиться этими ресурсами.

Комментарии:

1. Спасибо за информацию! Теперь я понимаю использование. Я попробовал аналогичный код в 1.x, который не вызывается unsubscribe() , onCompleted но добавленная подписка была отменена после завершения основной подписки. Затем я добавил dispose() onCompele() код in 2.0, и в результате добавленная подписка была удалена.

2. В 1.x почти все подписчики попадают в a SafeSubscriber , который вызывает unsubscribe для вашего подписчика. Мы не делаем этого по умолчанию в 2.x, экономя много накладных расходов во всей библиотеке.

3. Спасибо за объяснение! Поскольку причиной была проблема производительности, изменение понятно. Возможно, это может быть хорошей практикой, которая dispose была вызвана onComplete и onError когда пользователи использовали ResourceSubscription add(Disposable) .