タイトルが長い!
どういうことかと言うと・・・。
こんな感じのコードを書いていました。
fun callApis() =
viewModelScope.launch {
runCatching {
val hoge = async { api.hoge() }
val hage = async { api.hage() }
Pair(hoge.await(), hage.await())
}.fold(
onSuccess = {
data.postValue(it)
},
onFailure = {
Timber.e(it)
}
)
}
この状態で、api.hoge() 内で通信エラーとかで例外が発生するとonFailureを実装しているのに、そのままアプリが強制終了する。っていう自体に陥った。
よくよくデバッグしてみると onFailure は1度は呼ばれていて、なぜか2回目の例外も飛んできてcatch出来ないでいる模様。
何故か?わからん(ぉ
そもそもお作法的に多分間違っているんだと思う。
どう解決したか。
ここに書いてった。
しかし、やや複雑な処理が必要となる場合もあります。たとえば、1 個のコルーチン内で 2 個のネットワーク リクエストを同時に(または同じタイミングで)実行する必要があったとします。これを行うには、さらに別のコルーチンを開始することが必要となります。
https://developers-jp.googleblog.com/2019/07/coroutines-on-android-part-ii-getting-started.html
自分がやりたいことだよね。
別のスコープでやれば良い?って感じ。
ってことでこんな感じのコードになった。
fun callApis() =
viewModelScope.launch {
runCatching {
coroutineScope {
val hoge = async { api.hoge() }
val hage = async { api.hage() }
Pair(hoge.await(), hage.await())
}
}.fold(
onSuccess = {
data.postValue(it)
},
onFailure = {
Timber.e(it)
}
)
}
これで良いのかが定かじゃないけど、一応動いたから良しとする(良いのか?w