这也是面试被问到的问题,本来可以说的很明白的,可是没有说好。
今天就讨论一下他的使用。
记得看书的时候,书上是讲为什么要使用handler,因为Android中的控件在主线程中,也就是UI线程,一些耗时的工作如果在主线程中启动的话,就不能操作别的东西,这样对用户体验非常不好,在用户的眼里就是,这个程序卡住了,所以一些耗时的代码要另外开启一个线程,而为了Android的安全考虑,禁止在其他线程中操作主线程中的控件,所以得用一个对象来实现,就是接下来要将的Handler。
安全和原因现在都不知道是什么东西,以后再补上。今天仅仅是考虑他的使用方法。
Handler的基本概念
Handler主要是用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。这种机制通常用来处理相对耗时较长的操作。
Handler工具类在多线程中有两个方面的应用:
1.发送消息,在不同的线程间发送消息,使用的方法为sendXXX();
android.os.Handler对象通过下面的方法发送消息;
- sendEmptyMessage(int),发送一个空的消息
- sendMessage(Message),发送消息,消息中可以携带参数
- sendMessageAtTime(Message,long),未来某一时间点发送消息
- sendMessageDelayed(Message,long),延时Nms发送消息
2.计划任务,在未来执行某任务,使用的方法为postXXX();
android.os.Handler对象通过下面的方法执行计划任务;
post(Runnable),提交计划任务马上执行
postAtTime(Runnable,long),提交计划任务在未来的时间点执行
postDelayed(Runnable,long),提交任务计划延时Nms执行
上面的也不是很懂,就把我在实际中用到的写下来吧。
在主UI中实现:
private Handler handler = new Handler(){
@Override
public void handlerMessage(Message msg){
super.handleMessage(msg);
switch(msg.what==XXX)
.....
}
}
在其他线程中:
Message msg = Message.obtain()
然后在给msg.what = XXX 赋值
最后发送msg,handler.sendMessage(msg);
然后在主线程中,就会根据得到的msg.what的值,该进行不同的操作。
可能有问题哈,我自己在捉摸一下。