深入分析Android-Handler消息机制
Handler是Android消息机制的上层接口。通过它可以轻松地将一个任务切换到Handler所在的线程中去执行。通常情况下,Handler的使用场景就是 更新UI 。 在子线程中,进行耗时操作,执行完操作后,发送消息,通知主线程更新UI。 Handler消息机制主要包括: MessageQueue 、 Handler 、 Looper 这三大部分,以及 Message 。 从上面的类图可以看出: MessageQueue、Handler和Looper三者之间的关系: 每个线程中只能存在一个Looper,Looper是保存在ThreadLocal中的。 主线程(UI线程)已经创建了一个Looper,所以在主线程中不需要再创建Looper,但是在其他线程中需要创建Looper。 每个线程中可以有多个Handler,即一个Looper可以处理来自多个Handler的消息。 Looper中维护一个MessageQueue,来维护消息队列,消息队列中的Message可以来自不同的Handler。 在子线程执行完耗时操作,当Handler发送消息时,将会调用 MessageQueue.enqueueMessage ,向消息队列中添加消息。 当通过 Looper.loop 开启循环后,会不断地从消息池中读取消息,即调用 MessageQueue.next , 然后调用目标Handler(即发送该消息的Handler)的 dispatchMessage 方法传递消息, 然后返回到Handler所在线程,目标Handler收到消息,调用 handleMessage 方法,接收消息,处理消息。 从上面可以看出,在子线程中创建Handler之前,要调用 Looper.prepare() 方法,Handler创建后,还要调用 Looper.loop() 方法。而前面我们在主线程创建Handler却不要这两个步骤,因为系统帮我们做了。 初始化Looper : 从上可以看出,不能重复创建Looper,每个线程只能创建一个。创建Looper,并保存在 ThreadLocal 。其中ThreadLocal是线程本地存储区(Thread Local Storage,简称TLS),每个线程都有自己的私有的本地存储区域,不同线程之间彼此不能访问对方的TLS区域。 开启Looper 创建Handler : 发送消息 : post方法: send方法:
Android的handler机制的原理?
Android的handler机制的原理分为异步通信准备,消息发送,消息循环,消息处理。1、异步通信准备在主线程中创建处理器对象(Looper)、 消息队列对象(Message Queue)和Handler对象。2、消息入队工作线程通过Handler发送消息(Message) 到消息队列(Message Queue)中。3、消息循环消息出队: Looper循环取出消息队列(Message Queue) 中的的消息(Message)。消息分发: Looper将取出的消息 (Message) 发送给创建该消息的处理者(Handler)。4、消息处理处理者(Handler) 接收处理器(Looper) 发送过来的消息(Message),根据消息(Message) 进行U操作。handler的作用handler是android线程之间的消息机制,主要的作用是将一个任务切换到指定的线程中去执行,(准确的说是切换到构成handler的looper所在的线程中去出处理)android系统中的一个例子就是主线程中的所有操作都是通过主线程中的handler去处理的。Handler的运行需要底层的 messagequeue和 looper做支撑。