1. 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方法
2. Thread、ThreadPool、ThreadLocal
线程的一些东西