6

我有可觀察到的,它包裝一個HTTP請求如何刷新RxJava中的observable?

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。

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


作爲@DaveSexton註釋中有一個在RxJava使用defer功能更好的方法

到訂閱服務器訂閱不要創建可觀察的;創建 新鮮的可觀察每個訂閱

通延遲()可觀察到的工廠函數(一個函數, 產生可觀測量),並推遲()將返回一個可觀察的是 會調用這個函數來重新生成其顯着的序列 每次訂閱新的訂閱者。

更多這裏:https://github.com/ReactiveX/RxJava/wiki/Creating-Observables#defer

+0

在RxNet我們爲這個工廠方法:[推遲](http://msdn.microsoft.com/en-us/library/hh229160(V = vs.103 )的.aspx)。我認爲RxJava有一個類似的方法。 – 2014-12-02 01:34:10

+0

@DaveSexton非常好的一點,我要添加一個鏈接到RxJava延期文檔。從未聽說過這個,謝謝。 – tomrozb 2014-12-02 13:04:23

相關問題