RxJavaで並列処理と非同期チェーン
今のとこAndroid開発でRxJava使ってる。
待ち受けストリーム的な実装は基本的にしていなくて、jsでいうPromise的な扱いとLinq代わりのコレクション操作をRxJavaに任せてる、という感じ。
適当にやってるとその辺幾つか忘れる項目があるのでメモ。
並列処理
Observable.zipを使う。
Observable<Integer> obs1 = Observable.just(256);
Observable<String> obs2 = Observable.just("String");
Observable<Boolean> obs3 = Observable.just(true);
Observable.zip(obs1, obs2, obs3, (Integer i, String s, Boolean b) -> i + " " + s + " " + b)
.subscribe(str -> Log.d("debug" , str));
非同期チェーン
複数のServiceとして分けたObservable実装をつないでいくとき、
愚直に書くとどんどんネストが深くなっていって、なんかコールバック地獄みたいになる。
ここではflatMapを使っていく。
flatMapは次の処理にObservableを渡せる。
//observable1 , observable2 , observable3がそれぞれAPIを叩くような処理のとき。
observable1
.flatMap((result1)->{
if (result1の結果){
return observavle2();
} else {
return observable3();
}
})
.subscribeOn(Schedulers.newThread())
.onBackpressureBuffer()
.observeOn(AndroidSchedulers.mainThread())
.subscribe((result)->{
// onNext
},(err)->{
// onError
},()->{
//onComplete
});
ただ、他の言語でPromise返すような実装もそうだが、もし処理によって返す型が違うObservableを繋がなきゃいけないときの個人的プラクティスはあんまり固まってない。
この辺迷うくらいならAPIを叩くような個々のServiceはObservable単位で切らない方がいい。
Promise代替的なチェーンよりはなんだかんだasync/await的な構文の方が分岐周りとかスッキリするような気になっていて、
それもあって次はネイティブ部分が必要になる処理書くときはkotlin使ってみたい。
それ普通にhandler立てたら??????とか言わない。