Android的消息机制

一、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建消息发送到主线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值