Android 中为什么主线程不会因为 Looper.loop() 里的死循环卡死?

发布于 2022-09-20 23:33:27
关注者
0
被浏览
13
5 个回答
  • 匿名网友
    匿名网友 2022-09-20
    安卓应用就是靠事件驱动的,如果looper.loop停止了,应用也就停止了。当当前没有待处理的事件在消息队列里,loop中调用的queue.next 方法会被阻塞,主线程也就会被阻塞从而释放cpu资源,直到有新的事件派发后,再去处理新的消息,从而唤醒主线程。这也就是为啥安卓应用中组件的生命周期为啥会那么长的原因。
  • 匿名网友
    匿名网友 2022-09-20
    答题思路: 1.主线程什么时候创建的,什么是主线程,什么是UI线程 2.handler原理 3.epoll唤醒机制
  • 匿名网友
    匿名网友 2022-09-20
    是个误区 要理解AMS机制和handler消息 AMS机制:触摸5秒不响应就会卡死  广播10秒等等 Hander消息: 消息都存放在消息队列中,looper一直循环看那个消息到了时间后应该处理 Android activity,广播等这些都是通过Handler来发送消息,你如果在主线程处理耗时任务就会导消息队列阻塞,阻塞后activity消息得不到及时处理,超过了规定时间此时AMS发挥它的机制。所以耗时任务应该交给其它线程操作 卡顿根本原因:阻塞了消息队列,和循环没半毛钱关系
  • 匿名网友
    匿名网友 2022-09-20
    死循环就是google的设计,事件驱动,loop如果主线程退出则应用程序退出,你应该更关注阻塞机制,这块的阻塞机制与常见的阻塞模型不同,依赖于epoll,你可以看看
  • 匿名网友
    匿名网友 2022-09-20
    首先主线程因为Loop.loop()才没有结束 并且loop()中使用了消费者的概念消费着AMS分发给主线程的事件,具体可查看Handler底层实现; 最后卡死的定义是四大组件启动超时和输入事件得不到响应而被判定anr ;而非loop()产生,当然如果在主线程干耗时工作导致输入事件得不到响应也会出现anr
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看