接上文。 角色综述(回顾): (1)UI thread通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。 (2)需要一个Looper对象,来管理MessageQueue。 (3)可以构造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里有讯息,主线程执行到mHandler的handleMessage()来处理消息。 |
|