15

2 つの非同期タスクを実行したいと考えています。ZIP や Flat について何か読んだことがありますが、よくわかりませんでした...

私の目的は、ローカル SQLite からデータをロードすることです。完了すると、クエリがサーバー (リモート) に呼び出されます。

誰かがそれを達成する方法を私に提案できますか?

これは、私が使用している RxJava Observable スケルトンです (単一タスク):

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

            // Do the query or long task...

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

    // RxJava Observer
    Subscriber<Object> subscriber = new Subscriber<Object>() {
        @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);
4

3 に答える 3

10

クエリが互いに依存していない場合、Lukas Batteau の回答が最適です。ただし、リモート クエリを実行する前にローカル SQLite クエリからデータを取得する必要がある場合(たとえば、リモート クエリのパラメーターまたはヘッダーのデータが必要な場合) は、ローカル オブザーバブルから始めて、それをフラットマップすることができます。ローカル クエリからデータを取得した、2 つのオブザーバブルを結合します。

   Observable<Object> localObservable = Observable.create(...)
   localObservable.flatMap(object -> 
   {
       return Observable.zip(Observable.just(object), *create remote observable here*, 
           (localObservable, remoteObservable) -> 
           {
               *combining function*
           });
   }).subscribe(subscriber);

flatmap 関数を使用すると、zip 関数を介して、ローカルのオブザーバブルをローカルとリモートのオブザーバブルの組み合わせに変換できます。繰り返しますが、ここでの利点は、2 つのオブザーバブルがシーケンシャルであり、依存する両方のオブザーバブルが実行された後にのみ zip 関数が実行されることです。

さらに、zip 関数を使用すると、基になるオブジェクトの型が異なっていても、オブザーバブルを結合できます。その場合は、3 番目のパラメーターとして結合関数を指定します。基になるデータが同じタイプの場合は、zip 関数をマージに置き換えます。

于 2016-09-06T01:05:09.277 に答える
10

これを行うオペレーターは、 http://reactivex.io/documentation/operators/merge.htmlmergeを参照してください。

私のアプローチは、2つのオブザーバブル、たとえばobservableLocalとを作成observableRemoteし、出力をマージすることです。

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

リモートがローカルの後に実行されることを確認したい場合は、concat.

于 2016-01-12T11:34:10.543 に答える