Android 面试| Android的Handle消息机制
内容提要
Android音讯机制中的四大概念是ThreadLocal、MessageQueue、Looper和Handler。主线程不会因为Looper.loop()的死循环而卡死,而是因为长时间操作导致界面掉帧和ANR。子线程可以通过Handler、AsyncTask、LiveData和ViewModel等方式更新UI。Activity的生命周期是通过Android的音讯机制和Handler完成的。
延伸解读
主线程死循环为何不卡死
文章指出,Looper.loop()的死循环是为了保持主线程存活,避免App无故退出。当没有消息时,主线程会休眠,不占用CPU资源。真正导致卡顿或ANR的是在生命周期回调中执行耗时操作,造成界面掉帧。因此,开发者应避免在主线程进行长时间任务,而应将耗时逻辑移至子线程。
子线程更新UI的可行方式
子线程不能直接操作UI组件,但可通过多种机制间接更新。文章列举了Handler、AsyncTask、LiveData/ViewModel以及runOnUiThread()。这些方式本质都是将更新操作切换到主线程执行。其中,Handler和runOnUiThread()基于消息机制,而LiveData/ViewModel则利用观察者模式,在后台加载数据后通知主线程更新。
Activity生命周期与消息机制
Activity的生命周期回调并非直接调用,而是由AMS通过Binder IPC向ActivityThread发送消息,主线程的Handler处理这些消息后,再反射创建Activity实例并执行相应生命周期方法。例如,收到LAUNCH_ACTIVITY消息会触发onCreate。这解释了生命周期方法为何能在Looper循环外被调度执行。
Q&A
Android音讯机制的四大概念是什么?
Android音讯机制的四大概念是ThreadLocal、MessageQueue、Looper和Handler。
主线程为什么不会因为Looper.loop()的死循环而卡死?
主线程不会因为Looper.loop()的死循环卡死,因为当没有音讯需要处理时,主线程会休眠,等待新音讯的到来,不会占用过多CPU资源。
子线程如何更新UI?
子线程不能直接更新UI,但可以通过Handler发送音讯到主线程,使用AsyncTask、LiveData、ViewModel或runOnUiThread()方法来更新UI。
Activity的生命周期是如何通过音讯机制管理的?
Activity的生命周期通过Android的音讯机制和Handler管理,依赖于主线程的Looper.loop()处理不同的音讯来执行相应的生命周期方法。
什么是MessageQueue,它的作用是什么?
MessageQueue是具有时刻优先级的音讯行列,用于存储待处理的音讯,Looper会轮询这个队列以处理音讯。
Handler在Android音讯机制中扮演什么角色?
Handler用于具体处理逻辑,它在主线程的Looper循环中处理音讯,确保UI更新在主线程中进行。