1、异步消息处理机制
学习Android异步消息机制之前,我们需要搞懂这么几个问题:
·什么是异步消息处理
·为什么需要异步消息处理
·怎么实现异步消息处理
什么是异步消息处理:
所谓的异步机制,是指在进行消息处理时,不必等到消息处理完毕才返回。所以异步也就等同于非阻塞
通俗的来讲就是异步不用等待代码执行的结果,而去执行后续的代码。在弄清楚什么是异步之后,我们就需要了解一下什么是异步消息处理线程。回顾Java中线程的概念,一般的线程在执行完run方法后,线程也就随之结束。而异步消息处理线程则是一个内部无限循环的线程,每循环一次就从消息队列中取出一个消息进行处理,然后再取出下一个消息进行处理。这样就形成了一个异步机制。当其他线程想当前线程向当前线程发送消息时,只需要将当前消息发送到消息队列中,便可以执行其他操作,而当前线程就会在不定的时间从消息队列中取出消息进行处理。
为什么需要异步消息?
在Android开发中:
·为了保证Android的UI操作是线程安全的,Android中规定了只允许UI线程修改Activity中的UI组件;
·为了避免过多操作发生的同一线程中导致的阻塞问题
·在实际开发中,有不可避免的会用到多个线程并发操作UI组件,这又导致了UI操作是线程不安全的
所以最后要解决的问题是:
·保证线程安全;
·使多个线程并发操作UI组件
怎么实现异步消息处理?
在了解了异步消息的基础之后,我们可以得到实现异步消息的思路:
·每个异步线程中拥有一个消息队列,用先进先出的方式管理。外不线程可以向该消息队列添加消息
·每个异步消息的内部都会有一个while(true)的结构,进行无限循环,一旦消息队列中有消息,就取出相应的消息进行处理,并回调相应的方法。
在正式学习Android异步消息机制之前,还需要了解相关的概念:
主线程(UI线程):
·定义:当程序第一次启动时,Android会同时开启一条主线程(Main Thread)
·作用:主线程主要负责处理与UI相关的事件,所以主线程又叫UI线程
子线程负责一些比较耗时操作(联网、取数据、SD卡数据加载等操作),而主线程和子线程之间的通信就依赖于Handler了。
Message:
·定义:消息,理解为线程间通讯的数据单元(Handler接受和处理的消息对象,也就是基本的数据单元)
例如后台线程在处理完数据之后,需要更新UI,则需要发送一条包含更新信息的Message给UI线程
MessageQueue:·定义:消息队列
·作用:负责存放通过Handler发送过来的消息,也是一个按照Message执行时间先后排序的优先级队列
Handler:
·定义:handler是Message的主要处理者
·作用:负责将Message添加到消息队列中,并且处理Looper分配过来的Message
Looper:
·定义:循环器,MessageQueue于Handler之间的桥梁
·作用:主要负责消息循环,循环取出MessageQueue的Message;消息派发:将取出的Message交给相应的Handler
1、每个线程中,只能拥有一个Looper,但是一个Looper只能与多个线程的Handler绑定起来,也就是说很多歌线程可以往一个Looper所持有的MessageQueue中,发送消息。这就给我们提供了实现线程间通信的可能2、Handler在创建的时候,可以显示指定Looper。这样在Handler在调用sendMessage()投递消息的时候,会将消息添加到指定的Looper中的MessageQueue。如果不指定Looper,Handler默认绑定的是创建它的线程拥有的Looper
Android主线程异步消息处理的实现:在Java中,一个程序的入口是main方法,而我们在开发应用程序的过程中,并没有遇到过main方法,甚至有不少人认为程序的入口是onCreate()方法式应用程序的起点。其实不然,首先Android开发采用的是Java语法,并且程序的运行环境Dalvik是在JVM基础之上开发而来的,所以程序最后仍然是将main方法作为程序的入口。只不过Android的底层为我们完成了相应的封装,而它就是位于ActivityThread类中,因此ActivityThread也就是我们常说的主线程(也叫UIThread)。
public static void main(String args[]) {// 1、创建消息机制Loop,同时也会创建消息队列Looper.preparedMainLoop();if(sMainThreadHandler == null) { // 2、获得Handler对象sMainThreadHandler = thread.getHandler();}
// 3、进入消息循环Looper.loop();
}
在main方法中,并没有找到while(true)的结构,难道Android中的主线程不是异步消息处理?其实在Android中是通过Looper、Handler、Message、MessageQueue来实现异步消息的,,也正是在这样的机制中,各个类负责不同分工从而实现了异步消息处理。
在下一篇博客中,在详细介绍Looper、Message、MessageQueue、以及Handler工作流程以及异步消息机制的应用场景。