接上文。 角色綜述(回顧): (1)UI thread通常就是main thread,而Android啟動(dòng)程序時(shí)會(huì)替它建立一個(gè)MessageQueue。 (2)需要一個(gè)Looper對(duì)象,來(lái)管理MessageQueue。 (3)可以構(gòu)造Handler對(duì)象來(lái)push新消息到Message Queue里;或者接收Looper所送來(lái)的消息。 (4)線程A的Handler對(duì)象可以傳遞給別的線程,讓別的線程能送訊息來(lái)給線程A。 (5)線程A的Message Queue里的消息,只有線程A所屬的對(duì)象可以處理。 例二、子線程傳遞消息給主線程 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); } } } 說(shuō)明: Android會(huì)自動(dòng)替主線程建立Message Queue。子線程沒(méi)有建立Message Queue。所以mHandler屬于主線程。mHandler.sendMessage(m);將m消息存入主線程的Message Queue。mainLooper看到Message Queue里有訊息,主線程執(zhí)行到mHandler的handleMessage()來(lái)處理消息。 |
|