スレッドからUI要素をいじろうとするとアプリが落ちる問題の解決法

スレッドで情報取得し直ちにUI要素に入れようとすると落ちる

こうした悩みを解決します。

問題となった事象

メインアクティビティ{
  ~~
  ~~
  fun aaa(str: String){
          val textView: TextView = findViewById(R.id.txt)
          textView.text = str
  }
}

スレッド{
  ~~
  ~~
 aaa("insert text")
}

これでスレッドからinsert textを引数にメインアクティビティの関数を実行、この中でUIをいじるからOK…とはならないんですね。

対処法

runOnUiThreadを用いるとよいです。書き方はこちら。

メインアクティビティ{
  ~~
  ~~
  fun aaa(str: String){
          val textView: TextView = findViewById(R.id.txt)
          textView.text = str
  }
}

スレッド{
  ~~
  ~~
  runOnUiThread{
     aaa("insert text")
  }
}

runOnUiThreadでくくるだけでうまくいくんですね。

runOnUiThreadって何?

runOnUiThreadの中身を見てみます。

    public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }

UIスレッドだったらそのまま実行し、それ以外だったらハンドラに中身を送っているんですね。

スレッド間の通信はハンドラとルーパーで、みたいな取り決めがありますが、runOnUiThreadはそれを簡略化してくれているものなんですね。

勉強になるー…><

まとめ

スレッドからUIをいじりたいときはrunOnUiThreadで処理をくくってやりましょう

▼不明点や作成依頼などあればこちらからどうぞ
立プロに問合せる

▼インスタやってます

 

立プロ

組込エンジニア⇒個人事業主
ITと連携したビジネス発展をサポートしています。
C,C#,JavaScript, Vue, PHP, VBA, GAS, Kotlinなど、扱う言語が増えゆく日々。

立プロをフォローする
Kotlin
立科プログラミング
タイトルとURLをコピーしました