转:http://jbg168.blog.163.com/blog/static/996836201073011834301/
(1)UI thread 通常就是main thread ,而Android 启动 程序 时会 替它建立一 个 MessageQueue 。
(2) 当 然需要一 个 Looper 对象, 来 管理 该 MessageQueue 。
(3) 我 们 可以 构造 Handler 对象 来 push 新 消 息到 Message Queue 里 ;或者接收 Looper( 从 Message Queue 取出) 所送 来 的 消 息。
(4) 线 程 A 的Handler 对象 可以 传递给别 的 线 程, 让别 的 线 程 B 或C 等能送 讯 息 来给线 程 A( 存于A 的Message Queue 里 ) 。
(5) 线 程 A 的Message Queue 里 的 消 息,只有 线 程 A 所 属 的对象可以 处 理。
子线程传递消息给主线程
public class Activity2 extends Activity implements OnClickListener{
Button button = null ;
TextView text = null ;
MyHandler mHandler = null ;
Thread thread ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. activity1 );
button = (Button)findViewById(R.id. btn );
button .setOnClickListener( this );
text = (TextView)findViewById(R.id. content );
}
public void onClick(View v) {
switch (v.getId()) {
case R.id. btn :
thread = new MyThread();
thread .start();
break ;
}
}
private class MyHandler extends Handler{
public MyHandler(Looper looper){
super (looper);
}
@Override
public void handleMessage(Message msg) { // 处理消息
text .setText(msg. obj .toString());
}
}
private class MyThread extends Thread{
@Override
public void run() {
Looper curLooper = Looper.myLooper ();
Looper mainLooper = Looper.getMainLooper ();
String msg ;
if (curLooper== null ){
mHandler = new MyHandler(mainLooper);
msg = "curLooper is null" ;
} else {
mHandler = new MyHandler(curLooper);
msg = "This is curLooper" ;
}
mHandler .removeMessages(0);
Message m = mHandler .obtainMessage(1, 1, 1, msg);
mHandler .sendMessage(m);
}
}
}
说明:
Android 会 自 动 替主 线 程建立 Message Queue 。在 这个 子 线 程 里并没 有建立 Message Queue 。所以,myLooper 值 为 null ,而mainLooper 则 指向主 线 程 里 的 Looper 。于是, 执 行到:
mHandler = new MyHandler (mainLooper);
此mHandler 属 于主 线 程。
mHandler.sendMessage(m);
就 将 m 消 息存入到主 线 程的 Message Queue 里 。 mainLooper 看到Message Queue 里 有 讯 息 ,就 会作出处 理,于是由主 线 程 执 行到 mHandler 的handleMessage() 来处 理 消 息。