Android Looper 源码笔记

36 篇文章 0 订阅
23 篇文章 0 订阅
  1. final class Looper:类注释概括的很好:

    • 这个类是用于在一个Thread内运行message loop, 一个Thread默认是没有一个message loop的, 为了创建一个,可以在thread的运行中调用prepare()来将loop创建出来(TLS), 然后调用loop()来开始对消息的处理直到loop停止
    • 大多数和message loop交互是通过handler进行的.
  2. static final ThreadLocal sThreadLocal = new ThreadLocal();

    • 因为每个线程有自己的message loop, 那么显然需要的是一个ThreadLocal(TLS)来为每个线程维护自己的Looper的引用
  3. private static Looper sMainLooper:

    • MainLooper的概念就如同Android中的MainThread,即这个MainLooper是MainThread的Looper.
  4. 维护了一个MessageQueue引用,一个Thread引用,一个volatile的boolean 的mRun(该变量会涉及到多线程,但是因为只有一个线程会修改,其它都是读,因此volatile可以满足需求)

  5. prepare() prepare(boolean quitAllowed):

    • 首先确保Thread对应的Looper的TLS还没有被创建,否则会抛异常.
    • 如果没有,那么会new一个Looper并将其放入到TLS中.
  6. prepareMainLooper():

    • 其本身和prepare()没有太大区别(除了quitAllowed = false), 唯一的区别是会将sMainLooper设置为刚才生成的Looper的引用, 因为这个会调用调用此函数的线程的Looper成为mainLooper,Thread成为mainThread, 一般都是由Android系统自己在配置环境的时候调用的。
    • 对sMainLooper会引入同步,因为getMainLooper()可能会被别的线程调用
  7. loop(),static 方法,因为Looper是和线程绑定的,不应该依赖于一个具体的Looper对象来进行looper,而应该是自己取出线程的Looper的TLS来进行loop

    • 获取所在线程的Looper.
    • 如果looper是null, 那么直接抛异常.
    • for无限循环调用MessageQueue的next()来获取要进行的task, 如果next()的返回结果是null, 那么就代表messagequeue要结束,直接return,looper的loop()方法结束
    • msg**.target.dispatchMessage**(msg), 根据messag的target来进行那个msg的分发.
    • 最后要将next出的message进行recycle,因为message是池化的资源(每次new的话,因为调用次数太频繁,过于浪费)
  8. isCurrentThread():

    • Thread.currentThread() == mThread
    • mThread在Looper被new的时候 = Thread.currentThread().
  9. quit()/quitSafely():

    • MessageQueue的Quit(false)/Quit(true)
  10. postSyncBarrier()/removeSyncBarrier(int token), 控制Message处理流的办法

    • 该方法用来挂起当前所有pending的同步的Message的处理
    • 直到removeSyncBarrier(…)被调用。
    • postSyncBarrier()会返回一个token值, 这个token值用于后面removeSyncBarrier(token)时作为参数填入.
    • 前面所说的异步的Message不会受到这个Barrier的影响
  11. setMessageLogging(Printer printer):

    • 更多debug时使用,指定一个将Looper相关log输出的printer.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值