Android学习笔记之异步消息处理机制

一、异步消息处理机制

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");
    }
});

猜你喜欢

转载自blog.csdn.net/Ein3614/article/details/81782898