はじめに
今回は非同期処理であるコルーチンを使用した際、遭遇したクラッシュの対処法を調べてもなかなかいいものが見つからず苦労したので、
同じエラーが出た際にすぐに対応できるようにやった内容を記事に残しておきます。
今回発生したエラー
logがこちら
The exception was not handled due to missing onError handler in the subscribe()
method call. Further reading: https://github.com/ReactiveX/RxJava/wiki/Error-Handling |
java.lang.IllegalStateException: Method setCurrentState must be called on the main thread
訳
subscribe() メソッド呼び出しに onError ハンドラがないため、例外は処理されませんでした。さらに読む: https: //github.com/ReactiveX/RxJava/wiki/Error-Handling | java.lang.IllegalStateException: メソッド setCurrentState はメイン スレッドで呼び出す必要があります
実際のコードがこちら
viewModel.変数.subscribe {
if (it) {
// 画面遷移を促すメソッド
}
今回のエラー回避方法
viewModel.変数.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
if (it) {
// 画面遷移を促すメソッド
}
内容
非同期処理内でUIの操作やUIに変化を与える処理を加えるとクラッシュします
非同期処理でUIを操作 または UIに変化を加えたい場合は、エラー内容にもある通り
処理をメイン スレッドで呼び出す必要があります
具体的には observeOn() を追加することで、購読後の処理するスレッド
を追加しました
おわりに
今回はRxjavaでの非同期処理で遭遇したクラッシュに対しての対応でした
非同期処理内ではUIに対してのアクションは行えないのだと、強く認識することになりました
今後のkotlinではcoroutinesを使用することが増えると思いますが、
coroutinesでも同じことが言えると思いますので、非同期処理の勉強がまだまだ必要だなと実感すると共に
注意が必要だなと思いました
今回の対応は私の遭遇した問題に対しての対処になります
同じようなエラーで困っている方がいましたら、参考程度に役に立てていただければ幸いです
参考