Android消息机制其实指的就是Handler的消息机制 。
以上模型的解释:
1.以Handler的sendMessage方法为例,当发送一个消息后,会将此消息加入消息队列MessageQueue中 。
【android项目实例源码 android源码怎么运行】2.Looper负责去遍历消息队列并且将队列中的消息分发给对应的Handler进行处理 。
3.在Handler的handleMessage方法中处理该消息,这就完成了一个消息的发送和处理过程 。这里从图中可以看到参与消息处理有四个对象,它们分别是 Handler, Message, MessageQueue,Looper 。
ThreadLocal 是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有再指定线程中可以获取到存储的数据,对于其他线程来说则无法获取到数据 。
我们看下ThreadLocal是如何存储数据的:
public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);}
在源码里面我们可以看出ThreadLocal在存储数据的时候,会先拿到当前线程,然后根据当前线程会拿到一个叫做ThreadLocalMap 的Map数组;
那么ThreadLocalMap 又是什么呢?我们可以看到在CreateMap 里面是创建了ThreadLocalMap ,并且把我们当前线程当作Key,传递过去的 Value就是我们在调用ThreadLocal.set(T)传过来的值
void createMap(Thread t, T firstValue) {t.threadLocals = new ThreadLocalMap(this, firstValue);}
ThreadLocal是如何获取数据的
public T get() {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);//会先根据当前线程找到对应的ThreadLocalMap,如果没有就创建if (map != null) {ThreadLocalMap.Entry e = map.getEntry(this);if (e != null) {@SuppressWarnings("unchecked")T result = (T)e.value;return result;}}return setInitialValue();}//如果ThreadLocalMap 就会去创建ThreadLocalMapprivate T setInitialValue() {T value = https://www.jinnalai.com/fenxiang/initialValue();Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);return value;}
通过以上代码我们可以看出ThreadLocal是如何保证数据存储以后,只有再指定线程中可以获取到存储的数据,对于其他线程来说则无法获取到数据的了 。
我们如何保证Acticity的默认线程是主线程的呢
在Acticity 中我们用到的线程是ActivityThread这个线程,在这个线程的
main(String[] args)方法里面我们可以看到下面代码
public static void main(String[] args) {Looper.prepareMainLooper();ActivityThread thread = new ActivityThread();thread.attach(false, startSeq);if (sMainThreadHandler == null) {sMainThreadHandler = thread.getHandler();}if (false) {Looper.myLooper().setMessageLogging(newLogPrinter(Log.DEBUG, "ActivityThread"));}Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);Looper.loop();throw new RuntimeException("Main thread loop unexpectedly exited");}
//上面的代码里面我们可以看到创建 ActivityThread的 Looper.prepareMainLooper(); Looper.loop(); 保证了 ActivityThread为主线程 。
创建全局唯一Looper对象和全局唯一MessageQueue消息对象
Activity中创建Handler
推荐阅读
- springcloud项目搭建 网站cms系统哪个好
- 项目进度计划表软件推荐 工作进度管理app
- oa系统项目管理方案 oa项目描述介绍
- 测量不确定度计算公式 计算测量不确定度,实例?
- 项目部负责人的工作职责 项目负责人岗位职责是什么
- 科二考试项目顺序是一定的吗
- 换驾驶证需要体检什么项目
- 冬天去北京环球影城哪些项目可以玩(冬天去北京环球影城哪些是
- 北京环球影城冬季开放吗(冬天去北京环球影城所有项目都能玩吗
- 1.2米的小朋友在北京环球影城能玩哪些项目(带小朋友去北京环球