Android的消息机制主要是指Handler的云心机制,Handler的运行需要底层的MessageQueue和Looper支持.
Handler是Android消息机制的上层接口.
通过Handler可以轻松地将一个任务切换到Handler所在的线程中去执行.
有时候需要在子线程中执行耗时的I/O操作,可能是读取文件或者访问网络等.
10.1 Android的消息机制概述
Android的消息机制主要是指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程.
Android规定访问UI只能在主线程中进行,如果在子线程中访问UI,那么成句就会抛出异常.
Handler创建时会采用当前进程的Looper来构建内部的消息循环机制.
Handler的工作过程:
10.2 Android的消息机制分析
10.2.1 ThreadLoacl的工作原理
ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储之后,只能在指定线程中获取到存储的数据.
采用ThreadLocak可以让监听器座位线程内的全局对象,在线程内部只要通过get方法就可以获取到监听器.
ThreadLoacl的set和get方法,它们所操作的对象都是当前线程的localValues对象的table数组,因此在不同线程中访问同一个ThreadLoacl的set个get方法,它们对ThreadLocal所做的读/写操作仅限于各自线程的内部.
10.2.2 消息队列的工作原理
MessageQueue,主要包含两个操作:插入和读取.
插入和读取对应的方法分别为enqueueMessage(从消息队列中插入一条消息)和next(从消息队列中取出一条消息并将其从消息队列中移除).
10.2.3 Looper的工作原理
Looper在消息机制中扮演着消息循环的角色,具体来说就是它不不停地从MessageQueue中查看是否有新消息,有的话就会立刻处理,否则就一直阻塞在哪里.
通过Looper.prepare()就可以为当前线程创建一个Looper,接着通过Looper.loop()来开启消息循环.
10.2.4 Handler的工作原理
Handler的工作主要包含消息的发送和接收过程.
消息的发送可以通过post的一些列方法以及send的一系列方法来实现,post的一系列方法最终是通过send的一系列方法来实现的.
在日常开发中,创建Handler最常见的方式就是派生一个Handler的子类并重写其handleMessage方法来处理具体的消息.
10.3 主线程的消息循环
Android的主线程就是ActivityThread,主线程的入口方法为main,在main方法中系统会通过Looper.prepareMainLooper()来闯将主线程的Looper以及MessageQueue,并通过Looper.loop()来开启主线程的消息循环.
ActivityThread通过ApplicationThread和AMS进行进程间通信,AMS以进程间通信的方式完成ActivityThread的请求后会回调ApplicationThread中的Binder方法
然后ApplicationThread会向H发送消息,H收到消息后会将ApplicationThread中的逻辑切换到ActivityThread中去执行,即切换到主线程中执行,这个过程就是主线程的消息循环模型.