
スレッドで情報取得し直ちに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で処理をくくってやりましょう