RxJavaネスティングコールインタフェース

4976 ワード

私のタイトルはネスト呼び出しインタフェースであることがよく書かれています.たとえば、2つのインタフェースを呼び出す必要があります.2つのインタフェースが同時に成功することを許可します.1つの成功だけがUIを更新するのではなく、UIを更新するのに成功するのは1つだけです.そうしないと、UIを更新するのに成功すると「バグ」の感じがします.だから、呼び出し者の2つのインタフェースをネストします.1つ目のインタフェースが成功した上で2つ目のインタフェースを呼び出し、2つ目のインタフェースが成功した上でUIを更新します.(しばらくはあなたのニーズについて議論しませんが、そのインタフェース呼び出しは前の問題でなければなりません.後で直接言います)
RxJavaオペレータflatMapで直接解決できますが、mergeではありません.まずmergeがどのような効果をもたらすかを話します.
  1、merge:
コードは以下の通りです.私は特にtest 1に遅延を追加しました.mergeでインタフェースを調整するとき、そのインタフェースが先に呼び出されることを保証できないからです.ここでは、最初のインタフェース(test 1)が長いと仮定します.このように書くと、logは22を印刷してから111を印刷します.私がこのように書くと、誰かが反論するかもしれません.あなたが最初に遅延を加えたのは、彼が後に印刷したに違いありません.ほほほ、私の言ったのはとてもはっきりしていて、あなたはmergeが同時に2つのインタフェースを呼び出す时、あなたはそのインタフェースが先に呼び出すことを保証することができなくて、私のここのシミュレーションの情況は第1のインタフェースのネットのスピードが比較的に悪くて、私が表現したいのはmergeを使う时、ネストの効果を達成することができなくて、彼はそのインタフェースが先に呼び出すことができてsubscribeの中で先に行きます.
Observable test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable test2 = Observable.just("22");
        Observable.merge(test1, test2)
                .subscribe(o -> {
                    Log.e(TAG, o.toString());
                }, e -> {
                });
 2、flatMap:
呼び出しインタフェースをネストするのは、2つの理由(シーン)にすぎません.
(1)第1のインタフェースの戻り値を第2のインタフェースのパラメータとして使用する.
(2)2つのインタフェースが正常に呼び出されたことを前提に,2つのインタフェースを用いて返されるデータを組み合わせる.
(1)上のシーン1:
 Observable test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable.just(1)
                .flatMap(new Function>() {
                    @Override
                    public Observable apply(Integer integer) throws Exception {
                        return test1;
                    }
                })
                .flatMap(new Function>() {
                    @Override
                    public ObservableSource> apply(String s) throws Exception {
                        return Observable.just(s+"22");
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.e(TAG, o.toString());
                    }
                });
(2)上のシーン2:
Observable test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable test2 = Observable.just("666");
        result1 = "";
        Observable.just(1)
                .flatMap(new Function>() {
                    @Override
                    public Observable apply(Integer integer) throws Exception {
                        return test1;
                    }
                })
                .flatMap(new Function>() {
                    @Override
                    public Observable apply(String s) throws Exception {
                        result1 = s;
                        return test2;
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(String result2) throws Exception {
                        Log.e(TAG, result1 + result2);
                    }
                });

3、flatMapでインタフェースをネストします.もしあるインタフェースが間違っていたら、直接終了して、下に行かないで、以下のように私は5/0を使って、直接trhowableに行きます.
Observable test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable test2 = Observable.just("666");
        result1 = "";
        Observable.just(1)
                .flatMap(new Function>() {
                    @Override
                    public Observable apply(Integer integer) throws Exception {
                        int s = 5 / 0;
                        return test1;
                    }
                })
                .flatMap(new Function>() {
                    @Override
                    public Observable apply(String s) throws Exception {
                        result1 = s;
                        return test2;
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(String result2) throws Exception {
                        Log.e(TAG, result1 + result2);
                    }
                }, throwable -> Log.e(TAG, "   :" + throwable.getMessage()));