在Android中,当一个程序第一次启动时,Android会同时启动一条主线程来负责处理UI相关的事件,此时如果有多个线程并发操作UI组件,可能导致线程安全问题,所以Android只允许UI线程修改Activity里的UI组件。这就产生了一个问题,怎么样实现新启动的线程能动态改变界面组件的属性值呢?Handler的消息传递机制恰好解决了这个问题。
Handler类的主要作用两个:第一,可以在新启动的线程中发送消息。第二,在主线程中去获取和处理消息。然而,Handler发送消息时,必须把消息送到指定的MessageQueue消息队列中进行保存,MessageQueue采用先进先出的方式来管理Message。而MessageQueue是由Looper负责管理的,Looper不断地从MessageQueue中取出消息并分给对应的Handler进行处理。所以当前线程中必须要有一个Looper对象才能保证Handler正常工作。
怎样保证当前线程中有Looper对象呢?分两种情况:1,在主UI线程中,系统已经初始化了一个Looper对象,所以直接创建Handler即可。2,在自己写的子线程中,需要自己创建一个Looper对象,用Looper.prepare()即可。创建完后,它的构造器会自动创建与之配套的MessageQueue。然后创建Handler子类的实例,重写handleMessage()方法,处理来自其他线程的消息。最后,调用Looper.loop()启动Looper。