Handler概念,
实现原理,
异步实现方法,
与线程的关系
Handler消息队列的实现
使用Handler是异步的,它会建立新线程吗?
Handler是主线程内吗?
Handler的post和sendMessage方法,使用的是一个队列还是两个?
mars将有两个队列,线程队列和消息队列。
应该只有一个队列。
子线程中建立一个handler,然后sendMessage会怎样?
子线程建立handler,构造的时候传入主线程的Looper
Handler是做什么的,既然是异步任务处理,他本身是多线程的吗?
Handler作用:
1 执行计划任务
2 线程间通信
Handler的要素:
1 Handler.java 连接Looper和Message的操作,不关心Looper和Message的实现。
post()发送Runnable接口实现,实际调用sendMessage。1 消息发送到消息队列。2 回调函数和Runable关联。
sendMessage()把消息发送到消息队列。
handleMessage()接收
2 Looper.java(相当于隧道,监听器,监听消息队列中的消息)
可以关联消息队列并监听。
prepare()让当前线程具有一个looper的实例。
loop()循环监听消息队列。
不是所有的线程都有looper
思考一下looper的实现?
handler不是一个线程
looper是一个死循环,存在于一个线程中。
looper由系统来控制的,底层vm控制,和当前主线程没关系。looper没有新开一个线程。
并非每个线程都有一个looper实例。
3 Message.java,MessageQueue.java
MessageQueue.java:
enqueueMessage()将消息体放到消息队列。
next()游标指向下一个消息。looper循环时会用到。
Message.java:
实现Parcelable接口。一般需要传递的对象实现这个接口。需要序列号的还要实现序列化接口。
what属性 name-space
一个线程一般只有一个消息队列。
一个handler实例只能接收到自己发出的message信息。共用一个messageQueue,通过what属性,只取自己的message。
obtain()获取一个message对象的实例。handler中会通过botainMessage得到消息。实际是调用Message的obtain()方法。
5.线程:UI Thread通常是main thread,android启动程序时会替它建立一个MessageQueue
Handler不开启新的线程。
HandlerThread类默认有looper。