今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

Androidのシングルスレッドルール

Androidアプリで、新たに別スレッドを生成してそのスレッドからウィジェットを更新しようとしたら、android.view.ViewRoot$CalledFromWrongThreadexception なんて例外が発生した。

UIにアクセスできるのはそれ専用のスレッドがあるから、別スレッドからアクセスしちゃダメよってことらしい。 view#post(Runnable r) メソッドを使ってUIを更新しろってことで、実装をそのように変更した。

元のコード

    button.setEnabled(false);

変更後のコード

    botton.post(new Runnable() {
        public voir run() {
            button.setEnabled(false);
        }
    });

例外を投げてくれるのは、どこに問題があるのかが簡単に特定できるから分かりやすいよね。swingもこうしてくれれば、デッドロックで悩むこともなくてすんだのに。