一、异步消息处理机制
Android中的异步消息处理主要由四个部分组成:Message、Handler、MessageQueue和Looper。
1.Message
Message用于在线程之间传递消息,它可以在内部携带少量的信息。我们常用Message的what字段以及arg1、arg2字段来携带一些整型数据,使用Message的obj字段来携带一个Object对象。
2.Handler
Handler用于发送和处理消息。通过sendMessage()方法发送消息,通过handleMessage()方法处理消息。
3.MessageQueue
MessageQueue是消息队列的意思,它用于存放Handler发送出来的消息。这些消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个MessageQueue对象。
4.Looper
Looper是每个MessageQueue的管家,当我们调用了Looper的loop()方法之后,就会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,便会将它取出并传递到Handler的handleMessage()方法中。每个线程中也只有一个Looper对象。
PS:由于Handler是在主线程中创建的,所以handleMessage()方法中的代码也会在主线程中运行,于是我们就可以安心的进行UI操作了。
二、异步消息处理的简单运用
运用场景:通过点击一个按钮模拟请求网络之后,通过Message通知UI线程更新UI。
1.在子线程中发出Message
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_download:
new Thread(new Runnable() {
@Override
public void run() {
try {
//模拟请求网络下载文件
Thread.sleep(8000);
Message message = new Message();
message.what = DOWNLOAD_TAG;
handler.sendMessage(message);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
break;
default:
break;
}
}
2.在主线程中处理Message
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case DOWNLOAD_TAG:
tvDisplay.setText("Download Complete");
break;
default:
break;
}
}
};
PS:也可以使用将异步处理机制封装好的runOnUiThread()方法切换到主线程更新UI:
//模拟请求网络下载文件
Thread.sleep(8000);
runOnUiThread(new Runnable() {
@Override
public void run() {
tvDisplay.setText("Download Complete");
}
});