Должен ли Observable вызывать .onComplete() при удалении подписчика?

Я пишу Observable для обработки подключений к службам Android, созданным по образцу RxAndroidBle .establishConnection().

Я знаю, что .establishConnection() никогда не звонит .onComplete(); после того, как он создает соединение, он либо удаляется подписчиком, либо завершается с ошибкой (обычно, если соединение потеряно). Но кажется разумным, что .onComplete() будет вызываться при удалении соединения. Я не смог найти официальную RxJava политику по этому поводу; кажется, что некоторые Observables делают это, а другие нет. Каково правильное поведение для Observable, который испускает один элемент, а затем удаляется?


person Robert Lewis    schedule 04.11.2018    source источник
comment
Вместо этого используйте Single.   -  person akarnokd    schedule 04.11.2018
comment
Да, я понимаю использование Single и использую их в некоторых своих программах; однако, когда источник создает событие типа соединения, удобно просто настроить Observable для разрыва соединения, как RxAndroidBle делает с соединениями Bluetooth LE. Одиночные игры не предоставляют такой возможности.   -  person Robert Lewis    schedule 04.11.2018


Ответы (1)


Каково правильное поведение для Observable, который испускает один элемент, а затем удаляется?

Если я правильно понял, это вопрос о том, как должен вести себя Observable при утилизации в соответствии с официальной реактивной политикой. На самом деле как вызов, так и отказ от вызова .onComplete() при удалении соответствуют контракту Observable, но последний кажется быть предпочтительным (выделено мной):

Наблюдаемое завершение

Observable может начать отправлять уведомления наблюдателю сразу после того, как Observable получит уведомление о подписке от наблюдателя.

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

Когда Observable отправляет своим наблюдателям уведомление OnError или OnComplete, это завершает подписку. Наблюдателям не нужно выдавать уведомление об отказе от подписки, чтобы завершить подписку, которая завершена Observable таким образом.

Где уведомления:

To Observer:

  • OnNext
  • OnCompleted
  • OnError
  • OnSubscribe (необязательно)

To ObservableSource:

  • Subscribe
  • Unsubscribe
  • Request (необязательно)
person Dariusz Seweryn    schedule 04.11.2018
comment
Я внимательно прочитал контракт, и, как вы заметили, в нем нет однозначной политики. Мне кажется, что должно быть и возможно, и желательно иметь четкое решение по этому поводу. Существуют ли варианты использования, которые поддерживают оба поведения? - person Robert Lewis; 04.11.2018
comment
Нет, о чем я знаю. Из моего опыта, когда Subscription в Observable удаляется, Observer знает, что он не получит никаких дальнейших уведомлений. - person Dariusz Seweryn; 05.11.2018