handler 是 android 提供的一个重要的异步消息处理机制, android帮助文挡中对handler的介绍如下:
它允许用户发送、处理消息和与线程的消息队列相关联的 runnable 对象。每一个 handler 实例都与一个单独的线程相关联。每次创建一个新的 hander 对象时,它都与创建该对象的线程或者该线程中的消息队列绑定在一起,这样 handler 就可以发送消息和 runable 对象到消息队列中,并在从消息队列中取出的时候处理它们。
Handler 主要有两种用法:( 1 )调度消息和 runnable 对象,并在某一时间点执行。( 2 )依次存放分属不同线程的行为。
我们可以通过以下方法来完成消息的调度: post postAtTime postDelayed sendEmptyMessage sendMessage sendMessageAtTime sendMessageDelayed , 后 续将会对这些方法进行一一介绍。
首先,我们看看常见的 handler 的用法:
首先在创建的 activity 里 创建一个私有的 Handler 对象,并重写其 handleMessage 回调方法:
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg. what ) {
case 123:
Log.e ( "malone" , "@@@@@@@@@@" );
break ;
}
}
};
在 onCreate 方法里面发送一个空的消息
mHandler .sendEmptyMessage(123);
当然,我们也可以在消息里面加上一些参数,并在 handleMessage里面判断这些参数,进行相应的处理
这些参数存放在Message类型的对象里面,通过sendMessage发送。
常见的创建Message对象的方式有 :
(1)直接创建Message,并对其数据赋值,如:
Message m = new Message();
m.what =123;
m.arg1 = 0;
m.arg2 = 1;
m.obj = this;
(2)通过Handler提供的obtainMessage方法获取,这种方法是android推荐使用的,因为它直接从消息池中获取消息,避免产生额外的开销,另外构造消息的过程是同步的,这样可以保证每一时刻只有一个消息被构造,
接下来看一个,handler处理runnable的例子,简单的计数器(XML省略):
定义两个变量
private TextView mText;
Runnable mRunnable;
long mtime = 0;
在oncreate里面定义一个runnable,重写run方法
mRunnable = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
mText.setText(""+mtime++);
mHandler.postDelayed(mRunnable, 1000);
}};
接下来通过handler调度runnable
mHandler.post(mRunnable);
这样就实现了一个简单的计数器,每一秒自动加1