如何刷新RxJava中的observable?

时间:2014-12-01 21:36:52

标签: android functional-programming reactive-programming rx-java

我有一个observable,它包装了一个HTTP请求

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);

订阅初始化到来时,将激活cold observable并触发HTTP请求。现在,我知道基础数据已经发生了变化,我需要做出同样的新请求。 我试过了

mSubscription.unsubscribe();

然后调用

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

再次,从我的理解,订阅应该触发observable,但它不起作用。 有什么建议吗?

1 个答案:

答案 0 :(得分: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函数更好的方法

  

在订阅者订阅之前不要创建Observable;创建一个   每次订阅都有新的Observable

     

传递defer()一个Observable工厂函数(一个函数)   生成Observables),defer()将返回一个Observable   将调用此函数重新生成其Observable序列   每次新订阅者订阅时。

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