Handler消息机制的原理及应用场景

来源:互联网 发布:键盘记录软件 编辑:程序博客网 时间:2024/05/17 07:00

Android系统中出于性能优化考虑,AndroidUI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题。为了解决这个问题,Android制定了一条简单的原则,只允许UI线程(亦即主线程)修改Activity中的UI组件。但实际上,有部分UI需要在子线程中控制其修改逻辑,因此子线程需要通过handler通知主线程修改UI,实现线程间通信。(在游戏开发中尤其常见,例如需要让新启动的线程周期性的改变UI,或者实现文件下载等。)

Handler机制主要包括四个关键对象,分别是:MessageHandlerMessageQueueLooper。下面对这四个关键对象进行简要的介绍。

1Message

Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。Messagewhat字段可以用来携带一些整型数据,obj字段可以用来携带一个Object对象。

2Handler

Handler顾名思义就是处理者的意思,它主要用于发送消息和处理消息。一般使用Handelr对象的sendMessage()方法发送消息,发出的消息经过一系列的辗转处理后,最终会传递到Handler对象的handlerMessage()方法中。

3MessageQueue

MessageQueue是消息队列的意思,它主要用来存放通过Handler发送的消息。通过Handler发送的消息会存在MessageQueue中等待处理。每个线程中只会有一个MessageQueue对象。

4Looper

Looper是每个线程中的MessageQueue的管家。调用Looperloop()方法后,就会循环检查MessageQueue中是否有消息,如果MessageQueue中存在一条消息,就会将它取出,并传递到HandlerhandlerMessage()方法中。此外每个线程也只会有一个Looper对象。在主线程中创建Handler对象时,系统已经为我们创建了Looper对象,所以不用手动创建Looper对象,而在子线程中创建Handler对象时,我们需要调用Looper.prepare()方法创建一个消息循环,最后调用 Looper.loop()使消息循环起作用,从消息队列中取消息,处理消息。

0 0
原创粉丝点击