#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
когда пользователи использовали ResourceSubscriptionadd(Disposable)
.