android postdelayed 多个定时会干扰吗,Handler的postDelayed为什么可以实现定时器
在Android中如果在主线程中进行耗时的操作会引起ANR的异常主要有两个原因:1.当前的事件没有得到及时的处理,即Handler在处理上一个事件2.当前事件正在处理,但是没有及时的完成。解决的方法是耗时的操作放在子线程。提出的问题:为什么Looper.loop()没有造成ANR。Looper.loop( )是会让主线程进入死循环。但是不会卡主程序,卡住程序主要是handleMessage处理消息
在Android中如果在主线程中进行耗时的操作会引起ANR的异常
主要有两个原因:
1.当前的事件没有得到及时的处理,即Handler在处理上一个事件
2.当前事件正在处理,但是没有及时的完成。
解决的方法是耗时的操作放在子线程。
提出的问题:
为什么Looper.loop()没有造成ANR。
Looper.loop( )是会让主线程进入死循环。但是不会卡主程序,卡住程序主要是handleMessage处理消息的时候来不及处理导致的。Android的消息处理机制是事件驱动型的。
跑题了:
1.进入postDelayed(Runnable r,long delayMillis)方法
2.进入sendMessageDelayed(getPostMessage(r),delayMillis)
改方法返回的boolean值表示成功的加入队列
3.sendMessageAtTime(msg,SystemClock.uptimeMillis()+delayMillis)
4 boolean enqueueMessage(queue,msg,uptimeMillis)
主要是这一步,Looper.loop()从MessageQueue中的next的方法中获取消息时,如果消息队列没有消息或者有延时的消息,会阻塞主线程,当再次有Msg进入队列的时候,如果这个Msg不是Delayed的,就会放在MessageQueue的队首,然后needWake为True,唤醒next方法,重新从队列里面获取消息,当再次获取到没有到点的延时消息时又会阻塞。只要这个主进程没有挂掉,没有被退出,这个定时任务就一定会执行。
更多推荐
所有评论(0)