Handler/Message/Looper

Handler.post(Runnable r) 通过这种方式post的runnable 会被转化成一个message的callback message.callback.

Handler(Callback callback) 或者Handler(Looper looper, Callback callback) 这种里的callback是一个实现了handleMessage()方法的Handler.callback. 其实相当于重写handler里的handleMessage方法。两个作用一样,只不过执行的时候先执行这个callback

Looper.prepare()

private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper(quitAllowed));}

Looper和线程绑定。

a. 在Looper内通过sThreadLocal可以获取Looper所绑定的线程; 

b.线程sThreadLocal通过sThreadLocal.get()方法可以获取该线程所绑定的Looper对象。

private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed); mThread = Thread.currentThread();}

Looper和messagequeue绑定

我们就可以在外部通过调用Looper.myLooper()获取当前线程绑定的Looper对象。 

myLooper的代码如下所示:

public static Looper myLooper() { return sThreadLocal.get();}

上面在prepare的时候 就已经通过set方法将looper和thread绑定了。可以通过get方法取得该looper

在调用了Looper.prepare()方法之后,当前线程和Looper就进行了双向的绑定,这时候我们就可以调用Looper.loop()方法让消息队列循环起来了。 

需要注意的是Looper.loop()应该在该Looper所绑定的线程中执行。

loop()里有这几句:

1. final Looper me = myLooper();

final MessageQueue queue = me.mQueue;

将绑定的looper的消息队列拿出来。

2.  for (;;) 死循环取出msg

3. Message msg = queue.next();

我们通过消息队列MessageQueue的next方法从消息队列中取出一条消息,如果此时消息队列中有Message,那么next方法会立即返回该Message,如果此时消息队列中没有Message,那么next方法就会阻塞式地等待获取Message

4. msg.target.dispatchMessage(msg);

msg的target属性是Handler,该代码的意思是让Message所关联的Handler通过dispatchMessage方法让Handler处理该Message

1. msg.target = this;

该代码将Message的target绑定为当前的Handler  这样msg和处理他的handler绑定了起来

2. queue.enqueueMessage(msg, uptimeMillis);

消息队列里加入了msg

Handler.dispatchMessage()

public void dispatchMessage(Message msg) { //注意下面这行代码 if (msg.callback != null) { handleCallback(msg); } else { //注意下面这行代码 if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } //注意下面这行代码 handleMessage(msg); }}

执行顺序1. post的runnable 2. new的时候穿的callback 3. Handler的handlerMessage方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值