一、Android为什么不允许在子线程中访问UI
主要是因为android的UI线程不是线程安全的,会导致系统的状态不一
二、Handler的运行流程
Handler在外部线程中发送一个消息后,消息会被添加到内部线程的MessageQueen。内部线程的Looper会不断的轮询MessageQueen来获取消息。当Looper发现有消息后就会在内部线程执行消息
三、ThreadLocal的使用场景
ThreadLocal一般用于以线程为作用域来存储数据、获取数据。每个线程只能获取到它所在的线程的数据。
四、ThreadLocal的使用及其原理
1、使用
首先声明ThreadLocal对象:ThreadLocal mThreadLocal=new ThreadLocal();
在通过set()方法进行赋值:mThreadLocal.set(true)
通过get()方法取值:mThreadLocal.get();
2、原理
当进行set的时候,会调用Thread内部的ThreadLocal.Values内部类,它里面有一个Object[] table.这个table的第一个索引用来存储refrence,下一个来存储数据。如:table[index]储存的是refrence那么table[index+1]则存储的是refrence指向的数据
五、消息队列(MessageQueen)的工作原理
MessageQueen主要包含两个操作分别是:插入和读取。插入是enqueenMesssage().读取是next()
enqueenMessage实际上是将数据加入到队列(它实际上是链表,这样删除和插入更有优势)
next()内部是无限循环的读取链表,当没有消息时就阻塞。
六、Looper的工作原理
每个Handler都必须创建一个Looper.Looper通过Looper.Prepare()方法创建。Looper通过loop方法开始无限循环消息队列。当Looper调用quite方法时MessageQueen会返回null此时loop方法终止循环
七、Handler的工作原理
Handler的工作主要为发送和接收。发送可以通过Post和Send方法但最终调用的还是send。send方法只是将消息加入消息队列。
当looper收到消息时Handler的dispatchMessage会被调用假如消息处理阶段
八、主线程的消息循环
Activity的主线程实质是ActivityThread。在main方法中会通过Looper.prepareMainLooper()来创建Looper及MessageQueue.方法结束时又会开启Looper.loop()进行无限循环。主线程的Handler是ActivityThread.H类。它定义了一系列消息类型用于AMS返回消息到ApplicationThread中通过Handler建消息发送到主线程