androidアプリ作成時のメモです。
628 views
GUIはメインスレッドからしか変更できないため、データバインディングした変数をスレッドから更新するとエラーになる。
以下はエラーになるコード。
コールバック関数がスレッドで呼ばれ、スレッドでバインドした変数を変更しようとしている。
class ItemEventListener(override val itemId: Long, val fieldIndex:String, val label:String, val binding: InputField23BtnBinding): EventListener {
override fun callBack(itemRecord: MutableMap<String, String>) {
//ここがスレッドからの呼び出しになるため、エラー…。
if(itemRecord[fieldIndex] != "処理中") {
binding.button.text = label
binding.button.visibility = View.VISIBLE
binding.imageView.visibility = View.INVISIBLE
}
else {
binding.button.visibility = View.INVISIBLE
binding.imageView.visibility = View.VISIBLE
}
}
}
これを防ぐにはHandlerを作成し、Handlerにpostすることでバインドされた変数を更新できる。
なお、guiHandlerは、メインスレッドで生成しないとダメ。
以下のクラスの場合は、メインスレッドでインスタンスを作成したタイミングでHanlderが生成され、
callback関数が別スレッドで呼び出されるというもの。
class ItemEventListener(override val itemId: Long, val fieldIndex:String, val label:String, val binding: InputField23BtnBinding): EventListener {
val guiHandler = Handler()
override fun callBack(itemRecord: MutableMap<String, String>) {
guiHandler.post{
if(itemRecord[fieldIndex] != "処理中") {
binding.button.text = label
binding.button.visibility = View.VISIBLE
binding.imageView.visibility = View.INVISIBLE
}
else {
binding.button.visibility = View.INVISIBLE
binding.imageView.visibility = View.VISIBLE
}
}
}
}
Page 4 of 19.
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/