0
我需要显示用户启动应用程序时它们来自我的数据库的数据(它们立即可用),然后,我需要用即将来自网络的数据替换它们因为它们可用。使用RXJava顺序拨打电话
mDisposable = mRepository.getHighlights(forceReload)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<PaginatedData<List<Article>>>() {
@Override
public void onNext(PaginatedData<List<Article>> articles) {
mView.updateData(articles.getData(), articles.isFirstPage(), articles.isLastPage());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
而且getHighlights()方法:
我这样做是想这
return Observable.concat(getHighlightsFromDataBase(), getHighlightsFromNetwork()).map(new Function<List<ArticleResponse>, PaginatedData<List<ArticleResponse>>>() {
@Override
public PaginatedData<List<ArticleResponse>> apply(@NonNull List<ArticleResponse> articleResponses) throws Exception {
// ...
}
});
的问题是,它仅调用 “申请()”(在 “地图”方法)当getHighlightsFromDataBase()和getHighlightsFromNetwork()完成时。
所以不是有这个顺序:
getHighlightsFromDataBase()
getHighlightsFromNetwork()
map()
onNext()
map()
onNext()
我需要有:
getHighlightsFromDataBase()
map()
onNext()
getHighlightsFromNetwork()
map()
onNext()
的 “onNext” 是我说的是调用getHighlights方法的onNext ();(这样我可以在每次获得新数据时更新视图)。
我该怎么做才能做到这一点?
谢谢!
那么,为什么你不简单地应用地图每个observable分开? – yosriz
我想说你的代码看起来很好,应该做你想做的事:首先从数据库加载,然后从网络加载。然而,'getHighlightsFromDatabase'发出'onCompleted'后,'concat'将会订阅'getHighlightsFromNetwork()'。如果我没有弄错,可能是来自'getHighlightsFromDatabase'的最后/唯一一个项目通过'map'之前或之后。您可能想尝试添加一些人为延迟来更清晰地查看行为。 –
噢,以防万一你的“预期顺序”部分比我想象的更加直接:*当然*'getHighlightsFromNetwork()'将在开始时被调用 - 因为它被用作参数'concat',它需要在你进入map之前进行评估 - 毕竟,Java仍然有严格的(而不是懒惰的)评估。然而,'getHighlightsFromNetwork'必须返回一个'Observable',并且* Observable *的订阅将是懒惰的 - 正如我上面所说的那样,它会在'getHighlightsFromDataBase'的'onCompleted'后面发生。 –