メインのスレッド以外から、UIを操作する方法
要点:
ハンドラにてhandleMessage(Message m)をOverrideし、
その中に、UIパーツを操作する処理を記述する。
例では、mBodyというLinearLayout上に、TextViewとSurfaceViewを配置しています。
SurfaceViewでは、スレッドを回して描画し続ける感じで組んでます(ゲームアプリのアレ)
例:
SurfaceViewを継承したクラス。スレッドの設定時に
handleMessageをOverrideして、UIパーツに対してやりたい事を書きます。
今回は、TextViewに"hogehoge"という文字列を設定させます。
/* *省略してるけど、MyThreadのメンバにhandlerがあり、コンストラクタで設定するようにしてる。 * この辺は別に人それぞれ。 */ mTread = new MyThread(holder, context, new Handler() { @Override public void handleMessage(Message m) { // TextViewにテキストを設定する mBody.getTextView().setText(m.getData().getString("hoge")); } });
MyThreadというThreadを継承したもの(別スレッド)から呼び出す場合は、
メッセージを送信して、さっきのhandleMessage関数を呼び出してUIへの操作を行う。
例:
Message msg = mThread.getHandler().obtainMessage(); Bundle b = new Bundle(); b.putString("hoge", "hogehoge"); msg.setData(b); mThread.getHandler().sendMessage(msg);
これをしないと、メインのスレッド以外から操作しちゃダメよーという例外が
発生してアプリが落ちる。