課題
APIのレスポンスを処理する際にkotlin.runCatching
を用いて結果をLiveData<Result>
に格納しているが、
まれにkotlin.runCatching
のブロック内で戻り値とは別にLiveDataにResultをセットすることがあった。
private val _hoge: MutableLiveData<Result<Hoge>> by lazy { MutableLiveData() } private val _fuga: MutableLiveData<Result<Fuga>> by lazy { MutableLiveData() } fun getX() { _hoge.value = kotlin.runCaching { _fuga.value = Result.success(Fuga()) Hoge() } }
これまでは問題なく動作していたが、Kotlinを1.5にしてAndroid Studioを現時点の最新にしていたところ、どこかの時点でClassCastExceptionが発生するようになった。
対応
Kotlinのバグか仕様変更か分からないけれど、これまで動作していたコードが動かなくなったのは事実なので、とりあえずrunCatching
ブロック内で Resultをセットするのをやめることに。
fun getX() { _fuga.value = Result.success(Fuga()) _hoge.value = kotlin.runCaching { Hoge() } }
ちなみに、これがどちらも _fuga.value
(同じ代入先)だった場合にはブロックを分けてもエラーになった。この場合はメソッドを分けてしまった方が良いだろう。
コードをよくよく見直すとResultにする必要もない箇所もあったので、リファクタ観点では良かったのかも。
そのうち修正されるかもしれないが、そもそも
runCatching処理内でResultが別途発生するのもおかしいと思うので実装側で対応するのは間違いでもない気がする。