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の中で先に行きます.
呼び出しインタフェースをネストするのは、2つの理由(シーン)にすぎません.
(1)第1のインタフェースの戻り値を第2のインタフェースのパラメータとして使用する.
(2)2つのインタフェースが正常に呼び出されたことを前提に,2つのインタフェースを用いて返されるデータを組み合わせる.
(1)上のシーン1:
3、flatMapでインタフェースをネストします.もしあるインタフェースが間違っていたら、直接終了して、下に行かないで、以下のように私は5/0を使って、直接trhowableに行きます.
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
(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()));