重新去学习回顾looper和handler ,还是需要重新认识这个经常使用的机制。
我首先是看任玉刚老师的书《android的开发艺术探索》的第十章。
里面一句话开始说出了我们大概的理解
——handler的使用就是将一个人物切换到handler 所在的线程去执行。
在里面,我们需要理解handler运行需要两个底层looper 和 messagequeue
messagequeue,叫做消息队列,但是存储的不是真正的队列,而是单链表。
looper,使用来处理消息,而且对应也是每个对应线程的一个特殊的threadlocal。
整个过程,可以理解为:
handler通过sendmessage把msg发送到messsagequeue,然后messagequeue的next方法调用looper去处理这个msg消息。接下来,就是looper会把消息发送回handler的dispatchmessage方法来处理
但是有个地方,就是在dispatchmessage的msg.callback和Callback,两者间是有区别的,根据书上所说:
自带的Callback,可以用来创建一个handler的实例但是不需要派生handler的子类。
具体这个地方也需要理解。
而looper要注意的是,因为这个类会不断无限循环调用方法,需要在完成所有事情后使用quit或quitsafely(在所有消息结束后立即退出looper)。
handler 还有一个特殊的构造方法,就是
public Handler(Looper looper){
this(Looper looper,null,false);
}
这个也是解决我之前遇到过的一个异常:
can't create handler inside thread that has not called looper.prepare()。