美文网首页Android学习
异步消息处理机制

异步消息处理机制

作者: 雪脩 | 来源:发表于2019-02-10 13:09 被阅读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;
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:异步消息处理机制

        本文链接:https://www.haomeiwen.com/subject/ejoteqtx.html