メインのスレッド以外から、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);    


これをしないと、メインのスレッド以外から操作しちゃダメよーという例外が
発生してアプリが落ちる。