Путаница в создании реактивных потоков RxJava2 с помощью .create () - PullRequest
0 голосов
/ 18 октября 2018

Различные потоки RxJava2 (Single, Maybe и т. Д. - я буду называть их Xxx) имеют статический метод .create( XxxOnSubscribe onSubscribe ).Переданный объект XxxOnSubscribe должен реализовывать метод void subscribe( XxxEmitter emitter ).

Emitter похоже на Observer, но с некоторыми отличиями (это не совсем расширение Observer):

  • возвращает .subscribe() методvoid вместо Disposable
  • в нем отсутствует метод .onSubscribe() (который возвращает Disposable)
  • он добавляет методы .setCancellable(), .setDisposable(), .isDisposed()и .tryOnError().

В документах сказано: "Реализации эмиттера будут удалять / отменять этот экземпляр (какой экземпляр?), Когда нисходящий поток отменяет поток или после того, как логика генератора событий вызывает onSuccess(Object), onError(Throwable), onComplete() или когда tryOnError(Throwable) удастся. "

Среди моих вопросов по этому поводу:

  • Почему нельзя создать Xxx с обычным Observer с .subscribe(), возвращающим Disposable?
  • Почему .onSubscribe() исключено из Emitter?
  • Каково обоснование для требования Emitter?
  • Когда бы вы использовали Cancellable против Disposable?
  • Как добавление .tryOnError() помогает?

Есть ли более полное объяснение этой схемы?

(Возможно, связано: в моем Android-приложении, похоже, наблюдается странное поведение оператора .retry(). .retry() вызывает .dispose() upstream перед попыткой повторной подписки?)

1 Ответ

0 голосов
/ 18 октября 2018

какой экземпляр?

Должно быть ясно из контекста предыдущего предложения в документах :

Излучатель позволяетрегистрация отдельного ресурса в виде Disposable или Cancellable через setDisposable(Disposable) или setCancellable(Cancellable) соответственно.Реализации эмиттера будут удалять / отменять этот экземпляр, когда нисходящий поток отменяет поток или после того, как логика генератора событий вызывает onSuccess(Object), Emitter.onError(Throwable), Emitter.onComplete() или когда tryOnError(Throwable) завершается успешно.

экземпляр Disposable или Cancellable.

Почему Xxx не может быть создан с обычным наблюдателем

Мы не хотим, чтобы пользователь вызывалметод onSubscribe, поскольку он не используется в операторах.Мы не можем скрыть методы, поэтому мы разработали отдельный интерфейс только с поддерживаемыми методами.

с .subscribe (), возвращающим Disposable?

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

Почему .onSubscribe () был удален из Emitter

Нет причин вызывать его, поскольку оператор обработает вызов к Observer.onSubscribe для нисходящего потока для вас до вызова метода subscribe реализации эмиттера.

Каково обоснование для требования эмиттера?

Дизайн API.Мы предоставляем четкий набор методов, которые можно вызывать без раскрытия методов, которые не должны или не будут работать в любом случае.

Когда бы вы использовали Cancellable против Disposable?

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

Как добавление .tryOnError () может помочь?

Пожалуйста, прочитайте javadoc .

Есть ли более полное объяснение этой схемы?

Пожалуйста, посмотрите каждый пример в различных методах javadocs .

Вызывает ли .retry () .dispose () upstream перед попыткой повторной подписки?

Теоретически нет необходимости вызывать dispose при получении ошибки, кроме текущейреализация может сделать это независимо.Я должен подумать, нужно ли это изменить в RxJava или нет.

...