android Handler解析

  

java.lang.Object
    android.os.Handler

 它负责发送消息和处理线程消息队列中的消息及runnable对象 。

Android中的handler类是它特有的用于管理线程的工具类,方便于线程间通讯。

     Handler实例都是与一个线程和该线程的消息队列一起使用,一旦创建了一个新的handler实例,系统就把该实例与一个线程和该线程的消息队列捆        绑起来,这将可以发送消息和runnable对象给该消息队列,并在消息队列出口处处理它们。

     Handler默认使用当前的线程RunLoop,  但是也可以通过它的构造函数来指定某个线程的runloop, 或者使用专用的HandlerThread。

    必须要注意的是, 使用Handler的线程中,必须实现了Runloop消息循环,否则会产生运行异常。 

    通常情况下,如果我们在主线程使用Handler, 则不需要我们主动去创建runloop, 因为android系统为自动为activity主线程创建一个runloop。 

    同样我们可以在一个特殊的子线程中使用Handler,而不必去创建runloop。这个特殊子线程就是HandlerThread, 查看其源码,我们可以发现,它也在run方法中实现了runloop。

 


  下面就介绍Handler的几种使用场景和用法:

 1. 在主线程中使用Handler

      主线程中使用Handler相对简单, 下面的示例代码实现了在主线程中创建Handler对象,启动一个runable方法去刷新进度条。代码如下:

				      //在主线程中创建一个Handler对象
                                       Handler  handler = new Handler()
					{
						public void handleMessage(Message msg)
						{
							firBar.setProgress(msg.arg1);
							handler.post(updateThread);
							
							Log.v("thread----", Thread.currentThread().getName());
						}
					};
					handler.post(updateThread);  //去运行

	       //创建一个runable去刷新进度条
               Runnable updateThread = new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			if ( i>= 100) {
				handler.removeCallbacks(updateThread);
				return;
			}
				

			
			i += 10;
			
			Message msg = handler.obtainMessage();
			msg.arg1 = i;
			
			try {
				Thread.sleep(1000);    //线程暂停1s
			} catch (InterruptedException e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			
			handler.sendMessage(msg);
			handler1.sendEmptyMessage(0);
			
		}
	};

2.  在普通的子线程中使用Handler

     示例代码如下:

	//创建一个子线程,在其中使用Handler
	class MyThread extends Thread
	{
		
			public void run() {
				Looper.prepare();
				 handler1 = new Handler()//Looper.getMainLooper()
				{
				    public void handleMessage(Message msg)
				    {
				    	Log.v("SubThread",Thread.currentThread().getName());
				    	
				    	// 这里执行耗时操作,不会影响到UI主线程
				    	for (int i = 0; i < 1000000000; i++) {
							
						}
				    }
					
				};
				
				Looper.loop();
			}
	
	}

3.  在HandlerThread线程中使用Handler

     

				HandlerThread handlerThread = new HandlerThread("handlerThread");
				handlerThread.start();
				
				//这里获取到HandlerThread的runloop
				MyHandler myHandler = new MyHandler(handlerThread.getLooper());


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值