Android入门开发之 Handler使用

Helene 2013-04-26

Android提供了一个异步的消息回调机制Handler,  它负责发送消息和处理线程消息队列中的消息及runnable对象

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); 
         
    } 
}; 

相关推荐