6

У меня есть наблюдаемый, который оборачивает запрашивайте HTTPКак обновить наблюдаемые в RxJava?

mObservable = retryObservable(mService.getAddressList(getUserId(), true, 1, Integer.MAX_VALUE, "id", true) 
      .map(r -> { 
       return r.getItems(); 
      }) 
      .observeOn(AndroidSchedulers.mainThread())); 

затем подписной

mSubscription = mObservable.subscribe(items -> { 
       mAddressAdapter.swapItems(items); 
      }, getActivityBase()::showError); 

Когда приходит инициализация подписки, холодный наблюдаемым активируются и запрос HTTP срабатывает. Теперь я знаю, что базовые данные изменились, и мне нужно сделать такой же, но новый запрос. Я попытался

mSubscription.unsubscribe(); 

затем вызывая

mObservable.subscribe(items -> {doSomething();}) 

снова, как от моего понимания, подписавшись должен вызвать наблюдаемый, но он не работает. Любые предложения?

ответ

9

После того, как Observable был заполнен, он не публикует никаких новых товаров. Это контракт Rx.

Оберните свой код в метод и создайте новое наблюдаемое каждый раз.

Observable<?> getObservable() { 
    return retryObservable(mService.getAddressList(getUserId(), true, 1, Integer.MAX_VALUE, "id", true) 
      .map(r -> { 
       return r.getItems(); 
      }) 
      .observeOn(AndroidSchedulers.mainThread())); 
} 


Как @DaveSexton упоминалось в комментарии есть даже лучше подход с использованием defer функции в RxJava

Не создать Наблюдаемые до Подписчик не выписывает; создать свежую Наблюдаемый на каждую подписке

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

Подробнее здесь: https://github.com/ReactiveX/RxJava/wiki/Creating-Observables#defer

+0

В RxNet мы имеем фабричный метод для этого: [Перенести] (http://msdn.microsoft.com/en-us/library/hh229160 (v = vs.103) .aspx). Я предполагаю, что RxJava имеет аналогичный метод. –

+0

@DaveSexton Очень хорошая точка, я собираюсь добавить ссылку на документацию RxJava defer. Никогда не слышал об этом раньше, спасибо. – tomrozb

Смежные вопросы