Android / Kotlin / Programming

Android Input dispatching timed outの理由と解決策

KotlinのCoroutinesを使って作ったAndroidアプリをいざ動かしてみると真っ白な画面のまま固まったり、「Input dispatching timed out」エラーが出力されてしまった方に送る理由と解決方法です。

解決方法

下記コードのように、問題が起きている関数にdelay(10000)を加えてみてください。

fun func01(): Flow<Int> = flow {
    var x = 1
    val y = 2
    while (true) {
        emit(x)
        x += y

        delay(10000)
    }
}

原因

結論を先に言うと、関数内で停止するタイミングがない場合に発生します。

こちらにもあるように、大前提としてコルーチンはメインスレッドで動いています。
メインスレッドではUI描画や画面タップなどのユーザー操作を処理しているため、重い処理をするとアプリの反応が遅くなったり、そもそも反応しなくなったりします。

コルーチンがメインスレッドを止めることなく処理できる鍵は「suspend: 停止」と「resume: 再開」です。
あるコルーチンを停止させ、他のコルーチンを実行することで同じスレッド上でも複数の処理を同時に実行できます。

例えば上記コードの「delay(10000)」がない場合、この関数を実行すると無限ループの中で値の出力と計算を繰り返すことになります。
このサイクルはとても早く、停止するタイミングはありません。
しかし「delay(10000)」を加えると停止するタイミングができるため他のコルーチンの処理に移ることができます。

このようにsuspendできるタイミングを入れることで解決します。

その他

その他の解決方法については別記事で紹介しようと思います。(作成中)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です