我想运行2个异步任务,一个跟随另一个(顺序).我读过有关ZIP或Flat的内容,但我对此并不了解......
我的目的是从本地SQLite加载数据,当它完成时,它将查询调用到服务器(远程).
有人可以建议我,一种实现这一目标的方法吗?
这是我正在使用的RxJava Observable骨架(单个任务):
// RxJava Observable Observable.OnSubscribe
ajplumlee33.. 9
如果查询不依赖于彼此,Lukas Batteau的答案是最好的.但是,如果在运行远程查询之前有必要从本地SQLite查询中获取数据(例如,您需要远程查询参数或标题的数据),那么您可以从本地observable开始,然后将其平面映射到从本地查询获取数据后,合并两个observable :
ObservablelocalObservable = Observable.create(...) localObservable.flatMap(object -> { return Observable.zip(Observable.just(object), *create remote observable here*, (localObservable, remoteObservable) -> { *combining function* }); }).subscribe(subscriber);
flatmap函数允许您通过zip函数将本地observable转换为本地和远程observable的组合.重申一下,这里的优点是两个observable是顺序的,zip函数只在两个依赖的observable运行后运行.
此外,即使底层对象具有不同的类型,zip函数也允许您组合可观察对象.在这种情况下,您提供组合功能作为第3个参数.如果基础数据是相同类型,请使用合并替换zip函数.
如果查询不依赖于彼此,Lukas Batteau的答案是最好的.但是,如果在运行远程查询之前有必要从本地SQLite查询中获取数据(例如,您需要远程查询参数或标题的数据),那么您可以从本地observable开始,然后将其平面映射到从本地查询获取数据后,合并两个observable :
ObservablelocalObservable = Observable.create(...) localObservable.flatMap(object -> { return Observable.zip(Observable.just(object), *create remote observable here*, (localObservable, remoteObservable) -> { *combining function* }); }).subscribe(subscriber);
flatmap函数允许您通过zip函数将本地observable转换为本地和远程observable的组合.重申一下,这里的优点是两个observable是顺序的,zip函数只在两个依赖的observable运行后运行.
此外,即使底层对象具有不同的类型,zip函数也允许您组合可观察对象.在这种情况下,您提供组合功能作为第3个参数.如果基础数据是相同类型,请使用合并替换zip函数.
执行此操作的运营商将merge
参见http://reactivex.io/documentation/operators/merge.html.
我的方法是创建两个观测,比方说observableLocal
和observableRemote
,并合并输出:
ObservableobservableLocal = Observable.create(...) Observable observableRemote = Observable.create(...) Observable.merge(observableLocal, observableRemote) .subscribe(subscriber)
如果要确保在本地之后运行远程,则可以使用concat
.