android Looper Handler

class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
}


单向的消息触发模型.

每个线程可以对应一个消息循环队列Looper.消息循环队列Looper提供一个句柄Handler, 其他线程获得该Looper的句柄Handler可以将消息发给该消息循环队列Looper.

可以通过重写handleMessage对消息进行处理.

Looper.prepare()是创建消息循环队列

Looper.loop()是启动该消息循环队列.Looper.loop()相当于一个循环,没有消息时将会等待,有消息则进行处理.

所以Looper.loop()后的代码是没法执行的.


class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
          //could not run this code
          Log.v("test", "hello");
      }
}

只有在Looper结束后会执行Looper.loop()后的代码.你可以在handleMessage中调用Looper.quit().像下面这样.

class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
                  Looper.myLooper().quit();
                  //or this.getLooper().quit();
              }
          };

          Looper.loop();
          //could not run this code
          Log.v("test", "hello");
      }
}

注意Activity结束或者被覆盖时要根据应用的逻辑将相应的线程退出,显然Looper对应的线程一直在等待和处理消息.
 

那么一定要调用Looper.quit().

但是一般不像上面那样结束Looper,在别的线程,一般是主控线程或逻辑控制线程,可以通过Looper的句柄handler来处理.

调用mHandler.getLooper().quit()即可.

android的主线程默认是有消息循环队列的.因此不需要调用Looper.prepare().

public class TestActivity extends Activity
	public Handler m_handler;
	public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
    	//don't need to call Looper.prepare()
    	m_handler = new Handler(){
    		public void handlMessage(Message msg){
    		//handle msg here
    		}
    	};
    	//neither Looper.loop()
    }
        
}


 

 

 
 

 
 
 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值