前言
主线程负责处理UI事件、界面更新、以及与用户的交互的各种操作。
Android应用的核心原则:单线程模型,大多数与用户界面相关的操作都必须在主线程执行。
- UI一致性:在单线程模型下,UI操作不会被多线程竞争导致不一致问题,确保用户界面稳定性和一致性
- 性能优化:单线程模型简化了线程管理,减少因多线程竞争潜在问题,如:死锁和竞争条件
主线程通过消息循环(Message Loop)不断处理消息,UI事件、定时任务等。应用的UI操作会被封装成消息,由主线程依次处理。
主线程独特机制
消息队列和Handler。消息队列是主线程用来存储待处理消息的数据结构。每个消息都与之相关的Handler,他负责将消息放到队列中,主线程依次处理。消息队列机制保证了消息的有序性和及时性。
Handler
是一个特定的线程关联的对象,可以发送和处理消息。在主线程中用new Handler(Looper.getMainLooper())创建一个与主线程关联的Handler。可以使用Handler将任务提交到主线程队列中。
同步屏障
Android中,消息分为同步消息和异步消息。通常发送的消息都是同步消息。有一种特殊情况,即开启同步屏障。同步屏障是一种消息特性,可以阻止同步消息的处理,只允许异步消息通过。通过调用MessageQueue.postSyncBarrier()方法,开启同步屏障。开启同步屏障后,发送的这条消息他的target是null。
开启同步屏障后,异步消息顺序执行,忽略同步消息。
典型的使用场景在更新UI,如:View的绘制、布局调整、刷新等待等,系统会开启同步屏障,确保与UI相关的异步消息得到优先执行。UI更新完毕后,同步屏障会被移除,允许同步消息得到处理。
主线程的消息循环是通过Looper和Handler来实现的。主线程消息循环被启动,它会等待来自消息对立的消息。
主线程不会陷入无限循环
因为它不断的从消息队列获取消息并处理。如果没有消息需要处理,消息循环会进入休眠状态,不会持续消耗CPU资源。只有在新消息到达时,主线程才会被唤醒来处理消息。这个机制确保主线程能够响应用户操作,不陷入死循环。
主线程如果没有消息
消息队列为空,主线程的消息循环等待,直到新消息到达。在等待期间,它不会执行任何操作,也不会陷入循环。Android消息循环基于事件驱动,只有当事件(消息)到达,才会触发主线程执行相应的处理。当新消息投递到消息队列中,主线程会被唤醒,执行相应的操作,然后进入等待状态。
这种事件循环驱动机制使得Android应用能高效的管理用户交互和异步操作,同时保证了响应性和低能耗。主线程不会陷入无限循环,而是需要处理事件时才会处理相应的代码。
结论
Android主线程应用的核心,负责处理UI事件、界面更新和定时任务等。有助于确保应用的稳定性和性能。通过消息队列和Handler,开发者可以在主线程中安全地处理各种任务。