[Android]viewModelScope.launch内でasyncして例外が発生するとtry-catchしてても落ちる

タイトルが長い!

どういうことかと言うと・・・。

こんな感じのコードを書いていました。

    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

タイトルとURLをコピーしました