Android Handler的详细介绍
handler的定义
主要接受子线程发送的数据, 并用此数据配合主线程更新ui.
解释: 当应用程序启动时,android首先会开启一个主线程 (也就是ui线程) , 主线程为管理界面中的ui控件,进行事件分发。
比如说, 你要是点击一个 button, android会分发事件到button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到android系统的一个错误提示 "强制关闭". 这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到ui更新,android主线程是线程不安全的,也就是说,更新ui只能在主线程中更新,子线程中操作是危险的.
这个时候,handler就出现了来解决这个复杂的问题,由于handler运行在主线程中(ui线程中),它与子线程可以通过message对象来传递数据,这个时候,handler就承担着接受子线程传过来的(子线程用sedmessage()方法传弟)message对象,(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新ui。
handler一些特点
handler可以分发message对象和runnable对象到主线程中, 每个handler实例,都会绑定到创建他的线程中(一般是位于主线程),
它有两个作用:
1.安排消息或runnable 在某个主线程中某个地方执行
2.安排一个动作在不同的线程中执行
handler中分发消息的一些方法
post(runnable)
postattime(runnable,long)
postdelayed(runnable long)
sendemptymessage(int)
sendmessage(message)
sendmessageattime(message,long)
sendmessagedelayed(message,long)
以上post类方法允许你排列一个runnable对象到主线程队列中,
sendmessage类方法, 允许你安排一个带数据的message对象到队列中,等待更新.
handler实例
子类需要继承handler类,并重写handlemessage(message msg) 方法, 用于接受线程数据
以下为一个实例,它实现的功能为 : 通过线程修改界面button的内容
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();
// 当创建一个新的handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
// handler有两个作用, (1) : 定时执行message和runnalbe 对象
// (2): 让一个动作,在不同的线程中执行.
// 它安排消息,用以下方法
// post(runnable)
// postattime(runnable,long)
// postdelayed(runnable,long)
// sendemptymessage(int)
// sendmessage(message);
// sendmessageattime(message,long)
// sendmessagedelayed(message,long)
// 以上方法以 post开头的允许你处理runnable对象
//sendmessage()允许你处理message对象(message里可以包含数据,)
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
}
}
推荐阅读