分享

[经典]android 消息机制(二)

 aaie_ 2012-09-03

接上文。

角色综述(回顾):

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

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

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

(4)线程AHandler对象可以传递给别的线程,让别的线程能送讯息来给线程A

(5)线程AMessage 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 QueuemainLooper看到Message Queue里有讯息,主线程执行到mHandlerhandleMessage()来处理消息。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多