安卓handler

来源:互联网 发布:js 字符串函数大全 编辑:程序博客网 时间:2024/05/16 06:40
handler是一种更新UI,传递处理消息的机制.
因为在非主线程之中不可以直接更新UI,所以需要handler


机制.
handler使用的小例子:
首先在activity类中实例化一个handler:
private Handler handler=new Handler(){
public void handleMessage(){
//在这里覆盖该方法.实现你要处理消息的代码
}
}


然后,在非主线程传递消息,例如:
new Thread(){
public void run(){
//在这里传递消息:
Message me=new Message();
me.obj=某个对象;//假设对象为我们要传递的消



handler.sendMessage(me);
}
}


好的,上述代码已经可以基本实现handler的用法.
但是,我们还可以有点变化.
例如,在非主线程传递消息的代码可以为如下:
Message me=handler.obtainMessage();
me.obj=某个对象;
me.sendtoTarget();
上述代码,解释一下:handler.obtainMessage()方法是获


取默认的Message对象;.
me.sendtoTarget()方法是发送消息到绑定的handler对象


,作用相当于上文的handler.sendMessage()方法.






另外,在实例化handler对象时候.可以如下:
Handler handler=new Handler(new CallBack(){


public Boolean handleMessage(){

//这个方法跟下面的方法一样是处理消息的.但


是,这个方法有截获消息的作用.如果将返回值设置为


true,则可以使得下面的handleMessage不会执行.
}
}){
public void handleMessage(){

}
};




安卓为什么设计成只能通过handler来更新UI?
主要是多线


程并发的问题,假如多个线程共同更新UI,则会发生混乱


。那么为了处理混乱,我们不妨假设加上一把锁,这样子


,多线程并发可以执行了,但是由于锁的缘故,效率降低


,所以为了兼顾上述两者,安卓规定非主线程不可以更新


UI,只能通过handler




handler的原理是什么?
handler首先发送消息,其实消息


是发送到messagequeue当中,messagequeue是一个存储消


息的队
列,然后会有个叫做looper的对象调用looper方法


来不断的从messagequeue当中取出消息,假如有消息,则


会发回给handler,handler自身会处理消息。假如没有消


息存在,那么looper会将自身阻塞
0 0