关于handler的post、延迟消息这2个点有点忘记了。这两天重看了下handler源码,学习笔记总结下
之前写过一篇,handler源码分析
这里只说下架 post、延迟消息。
测试代码很简单:(Kotlin)
private var mHandler = object : Handler() {
override fun handleMessage(msg: Message?) {
super.handleMessage(msg)
Log.e("收到消息 ${msg?.what}","时间:${System.currentTimeMillis()}")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mHandler.sendEmptyMessage(1)
mHandler.sendEmptyMessageDelayed(2,5*1000)
mHandler.post(Runnable(){
Log.e("handler","post 线程:${Thread.currentThread()}")
})
mHandler.postDelayed({
Log.e("handler","postDelayed 线程:${Thread.currentThread()}")
},10*1000)
}
对应日志:
2021-04-06 09:15:07.237 E/收到消息 1: 时间:1617671707237
2021-04-06 09:15:07.237 E/handler: post 线程:Thread[main,5,main]
2021-04-06 09:15:12.204 E/收到消息 2: 时间:1617671712204
2021-04-06 09:15:17.204 E/handler: postDelayed 线程:Thread[main,5,main]
结论:
1、利用post发消息,可以直接跟回调处理代码
2、post完成后,处理代码的是主线程
postXX方法,最后也会都走到 sendMessageAtTime
引申个问题,handler 是怎么保证,延迟操作的正确性的?或者说,如果我指定了90秒后打印一句话,在90面之内