android中的Handler类可以用来执行Runnable类的run方法,它不同于java常用的两种线程调用方法(1、将Runnable类放入Thread构造函数中,然后调用start方法执行;2、扩展Thread类,覆写run方法,并调用start方法执行),此两个方法会创建一个新的进程执行run方法,handler大部分则是在创建它的线程里直接运行run方法。
handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
它有两个作用: (1): 安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行
Handler中分发消息的一些方法
post(Runnable)//立即将Runnable中run方法代码放到当前线程(创建handler的线程)执行
postAtTime(Runnable,long)//在一定时间后将Runnable中run方法代码放到当前线程(创建handler的线程)执行
postDelayed(Runnable long)//延迟一定时间后将Runnable中run方法代码放到当前线程(创建handler的线程)执行
sendEmptyMessage(int)
sendMessage(Message)//发送一个消息给调用此方法的handler,并触发该handler的handleMessage(Message msg)方法
sendMessageAtTime(Message,long)//在某一时间发送一个消息给调用此方法的handler,并触发该handler的handleMessage(Message msg)方法
sendMessageDelayed(Message,long)//延迟一定时间后发送一个消息给调用此方法的handler,并触发该handler的handleMessage(Message
msg)方法
以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新,Message里可以存放各种数据,如int,Bundle等来传递数据。
public class MyHandlerActivity extends Activity {
Button button;
MyHandler myHandler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.handlertest);
button = (Button) findViewById(R.id.button);
myHandler = new MyHandler();
MyThread m = new MyThread();
new Thread(m).start();
}
/**
* 接受消息,处理消息 ,此Handler会与当前主线程一块运行
* */
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper L) {
super(L);
}
// 子类必须重写此方法,接受数据
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.d("MyHandler", "handleMessage......");
super.handleMessage(msg);
// 此处可以更新UI
Bundle b = msg.getData();
String color = b.getString("color");
MyHandlerActivity.this.button.append(color);
}
}
class MyThread implements Runnable {
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("thread.......", "mThread........");
Message msg = new Message();
Bundle b = new Bundle();// 存放数据
b.putString("color", "我的");
msg.setData(b);
MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
}
}
}