当前位置:  开发笔记 > Android > 正文

如何在Android RxJava Observable中按顺序运行2个查询?

如何解决《如何在AndroidRxJavaObservable中按顺序运行2个查询?》经验,为你挑选了2个好方法。

我想运行2个异步任务,一个跟随另一个(顺序).我读过有关ZIP或Flat的内容,但我对此并不了解......

我的目的是从本地SQLite加载数据,当它完成时,它将查询调用到服务器(远程).

有人可以建议我,一种实现这一目标的方法吗?

这是我正在使用的RxJava Observable骨架(单个任务):

    // RxJava Observable
    Observable.OnSubscribe onSubscribe = subscriber -> {
        try {

            // Do the query or long task...

            subscriber.onNext(object);
            subscriber.onCompleted();
        } catch (Exception e) {
            subscriber.onError(e);
        }
    };

    // RxJava Observer
    Subscriber subscriber = new Subscriber() {
        @Override
        public void onCompleted() {
            // Handle the completion
        }

        @Override
        public void onError(Throwable e) {
            // Handle the error
        }

        @Override
        public void onNext(Object result) {

          // Handle the result

        }
    };

    Observable.create(onSubscribe)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(subscriber);

ajplumlee33.. 9

如果查询不依赖于彼此,Lukas Batteau的答案是最好的.但是,如果运行远程查询之前有必要从本地SQLite查询中获取数据(例如,您需要远程查询参数或标题的数据),那么您可以从本地observable开始,然后将其平面映射到从本地查询获取数据后,合并两个observable :

   Observable localObservable = 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函数.



1> ajplumlee33..:

如果查询不依赖于彼此,Lukas Batteau的答案是最好的.但是,如果运行远程查询之前有必要从本地SQLite查询中获取数据(例如,您需要远程查询参数或标题的数据),那么您可以从本地observable开始,然后将其平面映射到从本地查询获取数据后,合并两个observable :

   Observable localObservable = 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函数.



2> Lukas Battea..:

执行此操作的运营商将merge参见http://reactivex.io/documentation/operators/merge.html.

我的方法是创建两个观测,比方说observableLocalobservableRemote,并合并输出:

Observable observableLocal = Observable.create(...)
Observable observableRemote = Observable.create(...)
Observable.merge(observableLocal, observableRemote)
          .subscribe(subscriber)


如果要确保在本地之后运行远程,则可以使用concat.


这只有在observableLocal和observableRemote返回相同对象或此对象扩展的内容时才有效
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有