【7.23】群讨论未完待续。。。

【7.23】群讨论未完待续。。。

1、如何让在子线程中弹出toast?

调用Looper.prepare以及Looper.loop(),但是切记线程任务执行完,需要手动调用Looper.quitSafely()否则线程不会结束。

2、Handler 实现发送延迟消息的原理是什么?

我们常用 postDelayed() 与 sendMessageDelayed() 来发送延迟消息,其实最终都是将延迟时间转为确定时间,然后通过 sendMessageAtTime() -> enqueueMessage -> queue.enqueueMessage 这一系列方法将消息插入到 MessageQueue 中。所以并不是先延迟再发送消息,而是直接发送消息,再借助MessageQueue 的设计来实现消息的延迟处理。

消息延迟处理的原理涉及 MessageQueue 的两个静态方法 MessageQueue.next() 和 MessageQueue.enqueueMessage()。通过 Native 方法阻塞线程一定时间,等到消息的执行时间到后再取出消息执行。

3、post 和 sendMessage 两类发送消息的方法有什么区别?

post 一类的方法发送的是 Runnable 对象,但是其最后还是会被封装成 Message 对象,将 Runnable 对象赋值给 Message 对象中的 callback 变量,然后交由 sendMessageAtTime() 方法发送出去。在处理消息时,会在 dispatchMessage() 方法里首先被 handleCallback(msg) 方法执行,实际上就是执行 Message 对象里面的 Runnable 对象的 run 方法。 而 sendMessage 一类的方法发送的直接是 Message 对象,处理消息时,在 dispatchMessage 里优先级会低于 handleCallback(msg) 方法,是通过自己重写的 handleMessage(msg) 方法执行。

4、Handler是如何完成线程间切换的?

Handler 对象在哪个线程下构建,那么Handler就会持有这个线程的Looper引用(Looper 中会通过ThreadLocal来保障线程的唯一性)和这个线程的消息队列的引用。因为持有这个线程的消息队列的引用,意味着这个Handler对象可以在任意其他线程给该线程的消息队列添加消息,也意味着Handler的handlerMessage 肯定也是在该线程执行的。

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
提问者 irista23 2020-07-28 10:08:38

没有来得及参加QQ群讨论的小伙伴们,还可以在此继续留言讨论哈~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师