以前看过handler的原理, 但时间一长, 其基本原理又忘记的差不多了, 看了博客(转)深入理解之 Android Handler(相当好!!!)之后, 对handler有了更深刻的理解.
但是一直有些疑问. 深入理解之 Android Handler中提到: Looper是MessageQueue的管理者. 每一个MessageQueue都不能脱离Lopper而存在, Looper对象的创建
是通过prepare函数实现的. 同时每一个Looper对象和一个线程关联.
第一个疑问:一个普通的activity中创建的handler是如何跟当前UI线程关联起来的呢
接下来看Handler构造方法:
在上面的构造函数中,Handler中的消息队列指向Looper的消息队列. 这句话是关键, 为何?
在这里Looper的消息队列是属于UI线程的消息队列. 所有我们往消息队列发送消息, 实际上是往UI线程的MessageQueue发送消息,
自然而然就, 消息就通过UI线程来处理.
第二个问题: 这里的Looper.myLooper()为何就是UI线程Looper呢, UI线程是如何与Looper关联起来的呢.
继续搜索myLooper()的实现:
这里仅仅返回的是一个looper. 然后继续查看Threadlocal(Threadlocal位置在:libcorelunisrcmainjavajavalangThreadLocal.java )的实现
看到get的实现, 估计知道为什么这里的looper就是UI线程的looper了吧.
ThreadLocal以UI线程为KEY , 以Looper为值这样就把一个线程和一个looper关联起来了.
结论: 在activity的非UI线程中, 通过handler发送消息实际上是往UI线程的消息队列发送消息.