Handler

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

你可能感兴趣的:(Handler)