为什么Looper中的Loop()方法不能导致主线程卡死
程序员文章站
2022-04-01 10:45:46
Android 的消息机制涉及了四个类:Handler: 消息的发送者和处理着Message: 消息的载体MessageQueue: 消息队列Looper: 消息循环体其中每一条线程只有一个消息队列MessageQueue, 消息的入队是通过 MessageQueue 中的 enqueueMessage() 方法完成的, 消息的出队是通过Looper 中的loop()方法完成的.Android 是单线程模型, UI的更新只能在主线程中执行, 在开发过程中, 不能在主线程中执行耗时的操作, 避...
Android 的消息机制涉及了四个类:
Handler: 消息的发送者和处理着
Message: 消息的载体
MessageQueue: 消息队列
Looper: 消息循环体
其中每一条线程只有一个消息队列MessageQueue, 消息的入队是通过 MessageQueue 中的 enqueueMessage() 方法完成的, 消息的出队是通过Looper 中的loop()方法完成的.
Android 是单线程模型, UI的更新只能在主线程中执行, 在开发过程中, 不能在主线程中执行耗时的操作, 避免造成卡顿, 甚至导致ANR.
对于线程即是一段可执行的代码,当可执行代码执行完成后,线程生命周期便该终止了,线程退出。而对于主线程肯定不能运行一段时间后就自动结束了,那么如何保证一直存活呢??简单的做法就是可执行代码能一直执行下去,死循环便能保证不会被退出,例如:binder线程也是采用死循环方法,通过循环方式不同与Binder驱动进行读写操作,当然并非简单的死循环,无消息时会休眠,但是死循环又如何处理其他事物呢??通过创建新的线程。真正卡死主线程操作的是在回调方法onCreate、onStart、onResume等操作时间过长,会导致掉帧甚至ANR,Looper.loop()本身不会导致应用卡死。
Loop()本身只是將消息分發出去,要是真正造成卡死,是分發出去以後的線程操作進入死循環導致。
本文地址:https://blog.csdn.net/qq_21850177/article/details/107151024