Android消息处理机制(二)

转: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) 线 程 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() 来处 理 消 息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值