handler,message,looper学习笔记

handler消息传递机制android

1.循环者looper类ide

  一个线程对应一个looper对象,而一个looper对象又对应一个messagequeue。messagequeue用于存放message,在messagequeue中,存放的消息按照FIFO原则执行,messagequeu被封装到looper里面。函数

  looper对象用来为一个线程开启一个消息循环,用来操做messagequeue,默认状况下,android中断建立的线程是没有开启消息循环的,可是主线程除外,系统自动为主线程建立looper对象,开启消息队列。因此,在主线程中,运用Handler handler = new Handler();建立handler对象是不会出错的,但在子线程中建立就会有异常。oop

  若是想在非主线程中建立handker对象,首先需使用looper类的perpare()方法来初始化一个looper对象,而后建立这个handler,再使用looper类的loop()方法启动looper(),从消息队列中获取和处理消息。post

public class LooperThread extends Thread{ui

  public Handler handler;线程

  @override对象

  public void run(){队列

  super.run();内存

  Looper.prepare();

  //实例化handler

  handler = new Handler(){

  public void handleMessage(Message msg){

  switch(msg.what){

    case 1:...;break;

    case 2:...;break;

}

}

};

  Message m = handler.obtainMessage(); // 获取一个消息

  m.what = 1; //设置Message的what属性

  handler.sendMessage(m);

  Looper.loop(); //启动Looper

}

}

 

在主线程中建立该线程并启动。

 

注意:写在looper.loop()以后的代码不会被执行,该函数内部是一个循环,当调用Handler.getLooper().quit()方法以后,loop()才会停止。

 

2.消息处理类Handler

两个做用:

(1)将message或runnable应用post或Runnable()方法发送到messagequeue中,在发送时,能够指定延迟时间,发送时间和要携带的bundler数据,当messagequeue循环到该message时,调用相应的handler对象的handlerMessage()方法对其进行处理。

(2)在子线程中与主线程进行通讯,也就是在工做线程中与UI线程进行通讯。

说明:在一个线程中,只能有一个looper和messagequeue,但能够有多个handler,handler共享一个messageQueue和looper.

 

3.Message

  消息类被存在MessageQueue中,一个messageQueue中能够包含多个Message对象,每一个Message对象能够经过Message.obtain()得到或者handler.obtainMessage().

使用Message类的属性能够携带int型数据,可是若是要携带其余类型的数据,能够先将要携带的数据保存到Bundler对象中,而后经过Message类的setData()方法将其添加到Message中。

注意:

(1)尽管message有,默认的构造方法,可是一般状况下,须要使用Message.obtain()方法或者hangler.obtainMessage()方法来从消息池中得到空消息对象,以节省资源。

(2)若是一个Message只须要携带简单的int信息,应优先使用Message.arg0,和Message.arg1属性来传递消息,这笔用Bundler更省内存。

(3)尽量使用Message.what来白哦是信息,以便用不一样方式处理message.

相关文章
相关标签/搜索