zoukankan      html  css  js  c++  java
  • 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() 来处理消息。

     

  • 相关阅读:
    java 中类的加载顺序
    jdbc 连接数据库、批量操作、事务(oracle、mysql)
    一个空格引发的血案啊!
    Servlet 的生命周期与线程安全
    Java 方法的重写与重载
    java 序列化
    equals()与hashcode()的理解
    成功安装cadence SPB16.0
    stack implement C++
    windows 7 设置环境变量的方法
  • 原文地址:https://www.cnblogs.com/xuewater/p/2594798.html
Copyright © 2011-2022 走看看