Looper的工作原理

Looper 在 Android 的消息机制中扮演着重要的角色,具体来说就是它会不停地从 MessageQueue 中查看是否有新消息,如果有新消息就会立刻处理并删除消息,否则就一直阻塞在那里。

我们知道,Handler 的工作需要 Looper,没有 Looper 的线程就会报错。

在一个 Activity 主线程中,我们可以直接使用 Handler,因为 在activity 主线程中,系统会通过 Looper.prepareMainLooper () 来创建主线程的 Looper 以及 MessageQueue,并通过 Looper.loop() 方法来开启主线程的消息循环,所以不需要自己创建。

但是在 子线程中 要想使用 Handler 的话,怎么在子线程中创建Looper呢?其实很简单,通过Looper.prepare()即可为当前线程创建一个Looper,接着通过Looper.loop()来开启消息循环。


在子线程中,如果手动为其创建了 Looper,那么在所有的事情完成以后应该调用 quit 方法来终止消息循环,否则这个子线程就会一直处于等待状态,而如果退出 Looper 以后,这个线程就会立刻终止,因此建议在不需要的时候终止 Looper。


Looper的 loop 方法是一个死循环,唯一跳出循环的方式是 MessageQueue 的next方法返回null。当 Looper 的 quit 方法被

调用时,Looper就会调用 MessageQueue 的 quit 或者 quitSafely 方法来通知消息队列退出,当消息队列被标记为退出状态

时,它的 next 方法就会返回null。也就是说,Looper必须退出,否则loop方法就会无限循环下去。 loop 方法会调用 

MessageQueue 的 next 方法来获取新消息,而 next 是一个阻塞操作, 当没有消息时,next 会一直阻塞在那里,这也导致 

loop 方法一直阻塞在那里。如果MessageQueue 的 next 方法返回了新消息,Looper就会处理这条消息:

msg.target.dispatchMessage(msg), 这里的 msg.target 是发送这条消息的 Handler 对象,这样 Handler 发送的消息最终又

交给它的 dispatchMessage 方法来处理了。但是这里不同的是,Handler 的dispatchMessage 方法是在创建 Handler 时所

使用的 Looper 中执行的,这样就成功地将代码逻辑切换到指定的线程中去执行了

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值