Если вызов onComplete выполняется для объекта RxJava, мне нужно снова отменить подписку?
Я использую RxJava ReplaySubject в своем фрагменте.
Я пытаюсь использовать ReplaySubject таким образом, где бы я хотел, чтобы Subject выполнил процесс до завершения (возможно, вне жизни фрагмента).
По завершении процесса я хотел бы освободить ресурсы, которые, как я понимаю, выполняется, отменяя подписку на момент регистрации наблюдателя (что в моем случае является самим объектом).
В этом потоке ответов github @benjchristensen говорит:
Если это наблюдаемый, тогда он должен испускать onCompleted и выполняться.
Если это Наблюдатель, тогда он должен отказаться от подписки, полученной Подпиской, когда он назвал Observable.subscribe, и это даст Наблюдателю шанс завершить работу и очистить.
Если это Субъект, который является Наблюдателем и Наблюдаемым - что такое поведение? Если я вызываю onComplete по этому вопросу, это в основном означает, что подписка прекращена, и поэтому я освобождаюсь от необходимости вручную отменить подписку, которую я получаю, зарегистрировав наблюдателя?
Ответы
Ответ 1
Субъекты представляют собой относительно тонкий слой поверх наблюдаемого, который позволяет отправлять вызовы onNext()
, onCompleted()
и onError()
из внешнего источника Observable. Их поведение отписки - это то же самое, что и Observable. Если в теме будут вызывать onCompleted()
или onError()
, подписчики будут отписаны. Не нужно вызывать unsubscribe()
в подписке, возвращенной из Observable.subscribe()
.
При a ReplaySubject
обратите внимание, что ресурсы не будут очищены до сбора мусора. Даже после того, как onCompleted()
был вызван на ReplaySubject
, абонент все равно может подписаться, и он получит все оригинальные вызовы onNext()
, onCompleted()
или onError()
, которые были сделаны до подписания.