接上文。
角色綜述(回顧):
(1)UI thread通常就是main thread,而Android啟動程序時會替它建立一個MessageQueue。
(2)需要一個Looper對象,來管理MessageQueue。
(3)可以構(gòu)造Handler對象來push新消息到Message Queue里;或者接收Looper所送來的消息。
(4)線程A的Handler對象可以傳遞給別的線程,讓別的線程能送訊息來給線程A。
(5)線程A的Message Queue里的消息,只有線程A所屬的對象可以處理。
例二、子線程傳遞消息給主線程
public class Activity2extends Activityimplements OnClickListener{
Buttonbutton =null;
TextViewtext =null;
MyHandlermHandler =null;
Threadthread ;
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 MyHandlerextends Handler{
public MyHandler(Looper looper){
super(looper);
}
public void handleMessage(Message msg) {
text.setText(msg.obj.toString());
}
}
private class MyThreadextends Thread{
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。所以mHandler屬于主線程。mHandler.sendMessage(m);將m消息存入主線程的Message Queue。mainLooper看到Message Queue里有訊息,主線程執(zhí)行到mHandler的handleMessage()來處理消息。