1.介绍:Handle是一个消息机制,它可以做到线程与线程之间的通信。每一个Handler实例化都与与当前的线程关联。当你创建一个Handle时候,一定会有一个Looper。Looper的作用主要是将消息传递到Looper的消息队列中,然后在Looper的线程中执行他们。
执行Handle主要有两个途径:
(1).指定消息在某个时刻执行,post()方法里面主要是调用sendMessageDelayed(@NonNull Message msg, long delayMillis)该方法
(2)发送消息,它能使自己的线程不在该线程中执行。主要原理就是发送一个消息,并且加入到消息队列,每发送一次消息都会创建一个消息队列,然后Loope通过调用loop()该函数来遍历消息队列并且queue.next()来发送出去。
2.为什么要使用:
首先我们要知道ANR(Application Not Responding)的问题,以下情况会出现改问题:
a.App在主线程中10秒没有任何的响应
b.广播Broastcast 5秒内没有任何的响应
c.服务service 20秒内没有任何的响应(概率低)
如何避免呢?不要在主线程和BroastCast中进行耗时操作,如要进行耗时的操作,建议使用子线程来进行耗时操作,若要在子线程中进行UI操作,那么我们就要使用Handler来进行线程与线程之间的通信。
3.Handler主要有4个对象 Handler、Message、MessageQueue、Looper。
Handler:消息处理器
Message:消息存储
MessageQueue:消息队列
Lopper:循环器
下面工作流程图
Handler工作流程图
网友评论