• 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() 来处理消息。

     

  • 相关阅读:
    【ecshop】 完全清除版权信息
    【ecshop】使用sql 清除测试数据
    Java异常处理:给程序罩一层保险
    想清楚你究竟想成为什么样的人了吗?
    Java集合类的那点通俗的认知
    2019年的第一天,我给自己定了一份读书计划
    Java的内部类真的那么难以理解?
    29岁了还一事无成是人生的常态?
    Java接口的实例应用:致敬我的偶像——何塞·穆里尼奥
    程序员年底众生相
  • 原文地址:https://www.cnblogs.com/xuewater/p/2594798.html
Copyright © 2020-2023  润新知