Android学习

异步消息处理机制

2019-02-10  本文已影响21人  雪脩

我们在开发APP的过程中,经常需要更新UI,但是Android的UI线程是不安全的,如果想更新UI线程,必须在进程的主线程中。这里我们引用了异步消息处理机制来解决之一问题。

一.异步消息的组成

Android的异步消息处理机制主要有4个部分组成:Message、Handler、MessageQueue和Looper。现在对这4个部分进行简要介绍。

1. Message

Message是线程之间传递信息的机制,它可以在内部携带少量的信息,用于在线程之间交换数据。Message可以用whatarg1arg2obj携带信息。其中arg1arg2主要用于携带整型数据,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;
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读