Handler消息传递处理机制
简介:
出于性能优化的考虑,Android的UI操作并不是线程安全的,这以为这如果有多个线程并发操作UI组件的时候,就可能出现线程安全的问题。为了解决这个问题,Android制订了一条简单的规则,这条规则就是,只允许UI线程修改Activity中的UI组件。
Android在程序第一次启动的时候,就会同时启动一条主线程(Main Thread,主线程也经常被成为UI线程),主线程主要负责处理与UI有关的事件,并把相关的时间分发到对应的组件进行处理。
当需要让新启动的线程周期性的改变界面组件的属性值的时候就需要借助Handler的消息处理机制来实现了。
Handler类的主要作用:
– 在新启动的线程中发送消息
– 在主线程中获取、处理消息
Handler、Loop、MessageQueue
-
介绍:
-
MessageQueue:消息队列,存放消息的地方,按照FIFO规则执行,每一个线程只可以拥有一个MessageQueue。在创建Looper对象会创建一个MessageQueue对象。
- Message: 消息对象,MessageQueue中存放的对象。一个MessageQueue中可以包含多个Message对象。可以通过Message.obtain()或者Handler.obtainMessage()获取Message对象。但是这并不一定是直接创建一个新的实例,而是先从消息池中看有没有可用的Message实例,存在则直接取出返回这个实例。如果消息池中没有可用的Message实例,则才用给定的参数创建一个Message对象。调用removeMessages()时,将Message从MessageQueue中删除,同时放入到消息池中。
- Looper: 操作MessageQueue。一个Looper对应一个MessageQueue。通过调用Looper.myLooper()可以获得当前线程的Looper对象。Looper从MessageQueue中取出Message然后,交由Handler的handleMessage()进行处理。处理完成后,调用Message.recycle()将其放入消息池中。
- Handler: 消息的处理者。handler负责将需要传递的信息封装成 Message对象,然后调用sendMessage()方法将消息放入MessageQueue中。当MessageQueue循环到该Message,调用相应的handler对象的handleMessage()方法对其进行处理。Handler都可以共享同一Looper和MessageQueue。