这是简书的第一篇文章,希望自己慢慢更新。
Looper(循环者)
Looper 这个类最主要的属性感觉就是有一个MessageQueue,后面会讲到这个类
使用Looper对象都是先prepare,然后loop的
prepareprepare的时候可以让当前线程拥有一个Looper对象,一个线程也只能有一个Looper否则就会抛出异常。
ThreadLocal
ThreadLocal看注释,是当前线程的一个副本,暂且这么理解吧
loop程序一旦执行loop(),首先获得刚才的Looper对象,然后开始一个for循环,for循环不断从MessageQueue中取出Message,然后把msg交给msg的target去处理,很显然这个targer就是传说总的Handler。
MessageQueue然后再去Message中看看
MessageMessage中有个target 我就放心了,handler会处理发过来的消息,
dispatchMessage如果Message中如果有callback优先处理callback,否则会通过Handle的handleMessage去处理
handleMessagehandleMessage默认是空实现,一般我们写handle的时候会重写handleMessage方法。
文章写到这里好像就结束了,但是还有两个问题。
1.为什么我们可以直接new Handler(),Handler必须是生存在Looper线程中的,那是因为我们的UI线程就是一个Looper线程,所有消息会发送到UI线程的MessageQuene中,然后UI的Looper会取出消息让我们的handler 去处理发送过来的消息。
2.接着上个问题,为什么handleMessage可以更新UI呢?那是因为Handler会允许在它所在的Looper线程中,而这里的Looper线程正是主线程,所以UI就可以更新了
网友评论