异步消息处理机制
我们在开发APP的过程中,经常需要更新UI,但是Android的UI线程是不安全的,如果想更新UI线程,必须在进程的主线程中。这里我们引用了异步消息处理机制来解决之一问题。
一.异步消息的组成
Android的异步消息处理机制主要有4个部分组成:Message、Handler、MessageQueue和Looper。现在对这4个部分进行简要介绍。
1. Message
Message是线程之间传递信息的机制,它可以在内部携带少量的信息,用于在线程之间交换数据。Message可以用what
、arg1
、arg2
、obj
携带信息。其中arg1
、arg2
主要用于携带整型数据,obj
携带Object对象。
2. Handler
Handler是消息的处理者,它主要用于发送和处理消息。发送消息使用Handle的sendMessage()方法,接收消息使用Handler的handleMessage()对消息进行处理。
3.MessageQueue
MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息,这部分消息会一直存在MessageQeue中,直至被Looper发送会handleMessage()处理。每个线程只会有一个MessageQueue对象。
4.Looper
Looper是每个MessageQueue的消息管家,Looper的loop()方法会进入到一个无限循环当中,把MessageQueue中的消息取出,并传递到Handle的handleMessage()方法中进行处理。每个线程当中只会有一个Looper对象。
二.异步消息处理的流程
1.在主线程中创建一个Handler对象
,并重写handleMessage方法,我们主要在handleMessage中进行一系列的操作。
2.当子线程中需要进行UI更新时,就在子线程中创建一个Message对象
,并通过Handler将这条消息发送出去。
3.经Handler发送的消息会被添加到MessageQueue中等待被处理,而Looper会一直尝试从MessageQueue中取出消息进行处理。
4.最后Looper会将消息发送到Handler的handleMessage()方法中处理。
image
三、示例
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
public static final int UPDATE_TEXT = 1;
private TextView text;
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;
}
}
};
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.change_text:
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
handle.sendMessage(message);
}
}).start();
break;
default:
break;
}
}
}