Handler,Looper,HandlerThread

1.Handler,Looper原理

图解:

其根本点在于:
  1. 在 Handler所在线程通过创建一个 Looper来创建一个 MessageQueue
  2. 通过在 Handler所在线程执行 Looper.loop 循环,从 MessageQueue取出消息,在Handler所在线程执行
  3. 可以从其他线程通过 Handlerxian 向这个 MessageQueue中扔 msg
在构造和使用Handler前,要先确保当前线程有 looper,且looper已经运行:
  1. Looper.prepare准备 MessageQueue
  2. Looper.loop(),取消息的循环执行起来
需要关注的是,Looper所在线程退出之前,需要调用 looper.quit() 使得线程正在执行的 loop()循环停下来;
一般我们在主线程创建的hanler不需要这么做,是因为系统会帮助我们做;
而如果我们创建的handler依赖于自己启动的线程(和自己准备的Looper),那么在线程退出时,需要调用 looper.quit() 使之结束;

2. HandlerThread

HandlerThread继承自 Thread,唯一的特殊就是:

正常Thread中是没有 Looper在运行的,而HandlerThread的run方法执行后,就会给自己的 Thread准备一个looper,

并使 looper.loop() 循环起来;

所以使用 HandlerThread 创建的线程作为 Handler所在线程时,不需要再单独准备Looper;


但创建 Handler时,需要确保使用的 HandlerThread已经执行过 handlerThread.start();

只有 start调用完成 run()函数后才能准备好 Looper:


补充下,这个函数里使用 synchronized(this)的原因是为了在 Looper准备好之后,通知想要使用 Looper的 Handler所在线程,因为Handler 是在 HandlerThread之外的其他线程创建的,所以调用 HandlerThread.getLooper()时,可能HandlerThread还没有执行完成 run函数,也即还没准备好 Looper,所以会wait直到Looper准备好:


在这个函数里可以看到,如果 Looper还没有准备好,则会wait(),直到 Looper准备好;

还有一点,函数开始时,就判断当前Thread是否 isAlive(),如果没有 alive,则返回 null,导致 Handler创建失败,而只有Thread.start 之后,Thread才会 alive,所以,这是为什么使用 HandlerThread Looper创建 Handler之前,需要先通过HandlerThread.start() 使 Thread 运行起来的原因。



同样,HandlerThread退出时,也需要调用 quit()函数来结束 Looper 在当前 HandlerThread的执行:





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值