Android消息处理机制(二)

角色综述(回顾):

   (1)UI thread 通常就是main thread ,而Android 启动程序时会替它建立一个MessageQueue

(2) 当然需要一个Looper 对象,来管理该MessageQueue

(3) 我们可以构造Handler 对象来push 新消息到Message Queue 里;或者接收Looper(Message Queue 取出) 所送来的消息。

(4) 线程AHandler 对象可以传递给别的线程,让别的线程BC 等能送讯息来给线程A( 存于AMessage Queue)

(5) 线程AMessage 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 里有讯息,就会作出处理,于是由主线程执行到mHandlerhandleMessage() 来处理消息。

 

原文地址:https://www.cnblogs.com/xuewater/p/2594798.html