Android异步消息处理机制更新UI

很多时候我们会需要根据任务的执行结果来更新UI,比如做一个蓝牙小车,单片机把蓝牙的数据传到手机并显示在手机上。不知道各位童鞋是否尝试过在子线程中setText而发现程序崩溃,反正我是尝试过。看了郭大大的第一行代码,才发现原来在子线程中更新UI是不安全的,也是不允许的,会导致程序崩溃。对于这种情况,Android提供了一种异步消息处理机制,完美解决这个问题。

一、 原理

Android中异步消息处理主要由4个部分组成:Message、Handler、MessageQueue和Looper。

1、Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于不同线程之间交换数据。

2、Handler就是处理者的意思,主要用于发送和处理消息的。发送消息一般是使用Handler的sendMessage()方法,而发出的消息经过一系列的辗转处理后,最终会传递到Handler的handlerMessage()方法中。

3、MessageQueue是消息队列的意思,主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程中只有一个MessageQueue对象。

4、Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中。每个线程也只会有一个Looper对象。

二、整体流程:

1、主线程创建Handler对象、重写handleMessage()方法
2、子线程创建一个Message对象,并通过Handler将信息发送出去
3、信息被存放在MessageQueue队列中
4、Looper尝试从MessageQueue获取信息
5、最后分发回Handler的handleMessage()方法中,在这里更新UI

三、流程框图:

在这里插入图片描述

除此之外,Android还提供了另外一些好用的工具,如AsyncTask。借助这个工具,也可以实现更新UI,但其实原理也是基于异步消息处理机制,只是Android帮我们做好了封装。下一节我将会通过一个简单的小项目来加强对这个异步消息处理机制的印象。

发布了42 篇原创文章 · 获赞 39 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Hanghang_/article/details/86915077