Looper & Handler

从Looper代码看,Looper 是跟当前调用方法

 Looper.prepare();

的线程绑定的,会在当前调用的线程创建一个 Looper对象用于绑定当前线程,而且会存在 Looper 的这个成员变量中 ,那些就可以确保每个线程(调用过 Looper.prepare)的线程 存有当前的Looper

ThreadLocal<Looper> sThreadLocal

此时 已经为当前的线程 创建了一个Looper,并在Looper中创建好一个 MessageQueue 用来队列消息。此时 Looper,thread,MessageQueue 都绑定在一起。

然后 通过 调用 Looper.loop() 开始循环等待 Message的到来。

Handler

上面描述的看上去与handler没有关系。
当handler在这个线程 new的时候 (这个线程必须 已经 Looper.prepare(); 也就是说这个线程必须已经绑定了looper),这个时候 handler 回去通过 Looper.myLooper() 来获取 当前的looper 并拿到 MessageQueue,
后续 handler 的message post也好,send 也好都会丢到 这个拿到的 MessageQueue 中 ,也就是说会跟 当前的在哪个线程上new 的就绑到那个线程 上 这样就连起来了。Thread,Looper,MessageQueue,Handler;

所以 那种说是在非UI线程上更新UI的,所用到的Handler必须是在 main 线程上创建的,不然他绑不到main线程去。(操蛋的是 android 的UI 必须是在main线程上更新的,当然 如果你sufaceview 那又不一样了)

所以这两个玩意只是用来在把一个线程变成那种基于消息通知模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值