Looper、Handler、Message

Looper:

其作用在于把线程和消息队列绑定,创建一个MessageQueue,然后进入一个无限循环体不断从该MessageQueue中读取消息

MessageQueue:

是一种 数据结构,就是一个消息队列,存放消息的地方。每一个线程最多只可以拥有一个MessageQueue数据结构。
创建一个线程的时候,并不会自动创建其MessageQueue。通常使用一个Looper对象对该线程的MessageQueue进行管理。

主线程创建时,会创建一个默认的Looper对象。

其他非主线程,不会自动创建Looper,要需要的时候,通过调用prepare函数来实现。其函数源码如下:

public static final void prepare() {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        sThreadLocal.set(new Looper(true));
}
从上源码知,一个线程只能有一个Looper。

Looper的构造方法源码如下:

private Looper(boolean quitAllowed) {
        mQueue = new MessageQueue(quitAllowed);
        mRun = true;
        mThread = Thread.currentThread();
}
Looper对象的创建,将自动创建一个Message Queue。

下面是API中提供的示例代码:

prepare用来运行looper,然后调用loop方法循环的从消息队列中取出消息。

class LooperThread extends Thread {
      public Handler mHandler;
      
      public void run() {
          Looper.prepare();
          
          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };
          
          Looper.loop();
      }
  }

Handler:

对应于每个Looper,与之绑定,具体来处理消息队列中的消息。

一般Handler的构建如下

handler的默认构造方法就会获取并保存当前线程下的Looper对象,并获取这个Looper实例对象保存的MessageQueue

Handler handler = new Handler(Looper.myLooper())

这里说下handler下的两种方法:

sendMessage(Message msg)
sendMessageDelayed(Message msg, long delayMillis)

sendEmptyMessage(int what)
sendEmptyMessageDelayed(int what, long delayMillis) 

通过查看源码,我们知道前两种方法都是调用后面的Delayed,只是dalayMills设置为0.

Message:

对于一个Message实例对象,只能被handler发送一次。

这里有篇讲此Message机制比较好的博文

http://blog.csdn.net/lmj623565791/article/details/38377229

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值