RxJava и Observable при вызове модифицированного API - PullRequest
0 голосов
/ 21 июня 2019

Я новичок в RxJava и хочу понять Observable. Итак, я делаю один вызов API с использованием модернизации, и я наблюдаю изменения в результате, поэтому мои вопросы:

  1. Продолжается ли вызов API для получения последнего результата с сервера?
  2. Если да, то как часто он звонит?
  3. Это вызов один раз, тогда какой смысл наблюдать за данными?
  4. Это вызов один раз, тогда мы должны использовать RxJava только для того, чтобы сохранить пару строк в нашем коде? В этом случае мы можем просто использовать живые данные.
  5. Вызывается ли он один раз за жизненный цикл действия, т. Е. (Если действие будет убито и снова открыто, то получит новый результат?)

Вот фрагмент кода:

// fetching list of recipes
 mRecipeListViewModel.getRecipes().observe(this, new Observer<List<Recipe>>() {
            @Override
            public void onChanged(@Nullable List<Recipe> recipes) {
                // showing list of recipes
            }
        });

1 Ответ

1 голос
/ 21 июня 2019

это ... много вопросов.

  1. Ответ "это зависит". Покажите свой класс обслуживания (где вы определяете вызов Retrofit). Вызовы для модификации обычно Single вместо Observable, потому что API вернет результат и завершит вызов, поэтому использование наблюдаемого не имеет смысла в этом сценарии (Single is ... просто ОДИН результат или Ошибка).

  2. Один раз:)

  3. Вы наблюдаете за наблюдаемой, когда ожидаете, что указанная наблюдаемая будет излучать значения (через onNext), чтобы вы могли наблюдать за списком вещей и получать его элементы один за другим (например). Или вы можете иметь API, который время от времени генерирует элементы с открытым сокетом; RXJava может помочь вам подписаться на эту эмиссию и иметь дело с каждым элементом (onNext () ..)

  4. Я бы использовал LiveData, если вы не используете RxJava; RX хорош, но он огромен, и если все, что вы делаете, это просто вызываете модификацию Single Apis, я лично не буду беспокоиться о RX. Мощь RX зависит от множества (а иногда и невозможного для понимания или использования) операторов (map, flatmap, switch и т. Д.). и его супер текучий API. Он может делать очень мощные вещи, и для него написано много адаптеров и расширений. Это может быть неправильно использовано и к черту. Это умеренно продвинутый инструмент для очень хороших целей, который я бы не использовал сегодня, если бы у меня не было конкретного случая использования, который действительно хорошо подходит для .

  5. Это не имеет ничего общего с RX и больше связано с вашей архитектурой. Вы называете модификацию в своих методах жизненного цикла? (например, onStart?) или вы вызываете его, когда пользователь взаимодействует (например, нажмите кнопку). В любом случае, RX не имеет никакого отношения ни к одному из них и не будет ничего вызывать, если не будет сказано.

Подробнее

  • Если у вас есть API, который возвращает список «Things», такой как List<Thing>, вы можете сделать его Observable<Thing> getThings() в своем классе обслуживания. Это будет работать. Но это не так, как это будет работать; API, вероятно, отправляет массив (именно поэтому это список), поэтому в действительности он должен выглядеть как Observable<List<Thing>> getThings(), поэтому, когда вы подписываетесь, он будет выглядеть примерно так (это псевдокод):
api.getThing()
    .blah()
    .blah()
    .subscribe(...)

Подписка будет иметь 3 способа:

onError onNext и onComplete

Если вы посмотрите на OnNext, то это будет выглядеть как onNext(List<Thing> things), поэтому каждое излучение из Observable представляет собой LIST вместо того, что вы изначально думаете: "onNext(Thing thing), поэтому вы можете добавить things к списку.

Это не так, как это работает. Если ваш API возвращает список вещей ... вы, вероятно, захотите объявить его следующим образом:

Single<List<Thing>> потому что ваша подписка будет по существу иметь 2 метода вместо 3:

onError и onSuccess(List<Thing> things) (извините, если имена не на 100% точны, я не касался RX в течение нескольких лет). Итак, вы видите, API либо возвращает список, либо ошибку, нет нуля, нет следующего, нет полного; как только вы получите список, ваша подписка никогда не выдаст .

Надеюсь, это поможет вам немного лучше понять, что значит использовать RxJava (это обязательство!)

...