android

androidアプリ作成時のメモです。

440 views

スレッドからバインディングされたGUIを変更する場合

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。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。

サイト/ブログ

https://www.osumoi-stdio.com/pyarticle/

ツイッター

@darkimpact0626