handler是安卓的消息传递机制,有三个核心类:Lopper,Handler和Message; 另外还有个 Message Queue (消息队列) , 但MQ 被封装到了Looper 里面了,所以不会直接的和MQ打交道,因此不是核心的类;
Message
线程通讯的数据结构单元,负责装载数据
Looper
线程的魔法师Looper:Looper 的字面意思是"循环者" ,被设计来使一个普通线程变成Lopper 线程。即循环工作的线程。循环线程,一个线程不断的循环,一旦有了新的任务则执行,执行完继续等待下一个任务,这就是Looper线程;
Looper 的加深理解:
A、Looper 线程就是循环工作的线程;
B、一个Thread只能有一个Looper对象,它是一个ThreadLocal;
C、一个线程可以有多个Handler,但是只能有一个Looper
D、Looper内部有一个消息队列,loop() 方法调用后线程开始不断从队列中取出消息执行;
publicclassLooperThreadextendsThread {
publicvoidrun() {
// 将当前的线程初始化为Looper线程
Looper.prepare();
// Looper 开始工作,调用loop() 方法, 不断的从自己的MQ中取出队头的消息(任务)执行
Looper.loop();// 开始循环线程
} }
主要是用于多线程的应用场景中,将工作线程需要更新UI的操作传递给UI主线程,从而实现工作线程对UI的更新处理,最终实现异步消息处理。能够在多个线程并发更新UI的同时保证线程的安全,handler的使用方式有两种 handler.sendMessage()和handler.post()
使用方法1handler.sendMessage()
在使用这个方法们需要 创建handler的内部类或者他的子类,复写handleMessage()方法。handler通过sendMessage发送消息,交由handleMessage处理。
privateHandler mhandler =newHandler(){
@Override
public void handleMessage(Message msg){
...// 需执行的UI操作
} };
创建消息对象
Message msg = Message.obtain();// 实例化消息对象
msg.what =1;// 消息标识
msg.obj ="AA";// 消息内容存放
在工作线程中调用 mHandler.sendMessage(msg);
方法2handler.post() //在工作线程调用
private Handler mhandler = new mHandler();
mHandler.post(newRunnable() {
@Override
public void run(){
...// 需执行的UI操作
} });
一个没有looper的线程不能够调用handler