我有一个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,但它不起作用。 有什么建议吗?
答案 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