Android之异步消息处理机制

来源:互联网 发布:淘宝店能转让吗 编辑:程序博客网 时间:2024/05/17 02:44

Android之异步消息处理机制

一,简介

Android 中的异步消息处理主要由四个部分组成,Message、Handler、MessageQueue和
Looper。 其中Message和Handler在上一小节中我们已经接触过了, 而MessageQueue和Looper
对于你来说还是全新的概念,下面我就对这四个部分进行一下简要的介绍。

1. Message
Message 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线
程之间交换数据。上一小节中我们使用到了 Message 的 what 字段,除此之外还可以使
用 arg1 和 arg2 字段来携带一些整型数据,使用 obj字段携带一个 Object 对象。
2. Handler
Handler 顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消
息一般是使用 Handler的 sendMessage()方法,而发出的消息经过一系列地辗转处理后,
最终会传递到 Handler的 handleMessage()方法中。
3. MessageQueue
MessageQueue是消息队列的意思,它主要用于存放所有通过 Handler发送的消息。
这部分消息会一直存在于消息队列中, 等待被处理。 每个线程中只会有一个 MessageQueue
对象。
4. Looper
Looper是每个线程中的 MessageQueue的管家,调用 Looper的 loop()方法后,就会
进入到一个无限循环当中,然后每当发现 MessageQueue 中存在一条消息,就会将它取
出, 并传递到 Handler 的 handleMessage()方法中。 每个线程中也只会有一个 Looper对象。
了解了 Message、Handler、MessageQueue 以及 Looper的基本概念后,我们再来对异步
消息处理的整个流程梳理一遍。首先需要在主线程当中创建一个 Handler 对象,并重写
handleMessage()方法。然后当子线程中需要进行 UI 操作时,就创建一个 Message 对象,并
通过 Handler 将这条消息发送出去。之后这条消息会被添加到 MessageQueue 的队列中等待
被处理,而 Looper 则会一直尝试从 MessageQueue 中取出待处理消息,最后分发回 Handler
的 handleMessage()方法中。由于 Handler是在主线程中创建的,所以此时 handleMessage()方
法中的代码也会在主线程中运行,于是我们在这里就可以安心地进行 UI 操作了。整个异步
消息处理机制的流程示意图如图所示。


一条 Message 经过这样一个流程的辗转调用后,也就从子线程进入到了主线程,从不能
更新 UI 变成了可以更新 UI,整个异步消息处理的核心思想也就是如此。

二,实例

public class MainActivity extends Activity implements OnClickListener {public static final int UPDATE_TEXT = 1;private TextView text;private Button changeText;private Handler handler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case UPDATE_TEXT://  在这里可以进行UI 操作text.setText("Nice to meet you");break;default:break;}}};……@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.change_text:new Thread(new Runnable() {@Overridepublic void run() {Message message = new Message();message.what = UPDATE_TEXT;handler.sendMessage(message); //  将Message 对象发送出去}}).start();break;default:break;}}}

这里我们先是定义了一个整型常量 UPDATE_TEXT, 用于表示更新 TextView这个动作。
然后新增一个 Handler 对象,并重写父类的 handleMessage 方法,在这里对具体的 Message
进行处理。如果发现 Message 的 what 字段的值等于 UPDATE_TEXT,就将 TextView显示的
内容改成 Nice to meet you。
下面再来看一下 Change Text 按钮的点击事件中的代码。可以看到,这次我们并没有在
子线程里直接进行 UI 操作,而是创建了一个 Message(android.os.Message)对象,并将它
的 what 字段的值指定为 UPDATE_TEXT,然后调用 Handler 的 sendMessage()方法将这条
Message 发送出去。很快,Handler 就会收到这条 Message,并在 handleMessage()方法中对它
进行处理。注意此时 handleMessage()方法中的代码就是在主线程当中运行的了,所以我们可
以放心地在这里进行 UI 操作。接下来对 Message 携带的 what 字段的值进行判断,如果等于
UPDATE_TEXT,就将 TextView显示的内容改成 Nice to meet you。
现在重新运行程序,可以看到屏幕的正中央显示着 Hello world。然后点击一下 Change
Text按钮,显示的内容着就被替换成 Nice to meet you,如图所示。


这样你就已经掌握了 Android 异步消息处理的基本用法,使用这种机制就可以出色地解
决掉在子线程中更新 UI 的问题。不过恐怕你对它的工作原理还不是很清楚,下面我们就来
分析一下 Android 异步消息处理机制到底是如何工作的。


0 0
原创粉丝点击