Android进阶之路安卓学习日记

Android面试复习-Handler

2019-07-30  本文已影响0人  Margolu

Android中主线程是不能进行耗时操作的,子线程不能进行更新UI。所以handler就是实现线程之间的通信。把需要更新UI的消息直接发送给处理器Handler,通过重写Handler的handle Message()方法进行UI的相关操作。

Handler工作流程基本包括Handler,Looper,Message,MessageQueue四个部分。我们经常用到Handler和Message两个类。Messagef负责消息的搭载,handler负责消息的分发和处理。我们通过要传送的消息保存到Message中,handler通过调用sendMessage方法将Message发送到MessageQueue中,Looper对象就会不断调用loop方法,不断地从MessageQueue中取出Message交给handler进行处理,实现线程通信。

Handler整体工作流程详解

异步通信准备

1. 假定是在主线程创建Handler,则会直接在主线程中创建处理器对象Looper,消息队列对象MessageQueue和Handler对象。

2. Looper对象的创建一般通过Looper.prepareMainLooper()和Looper.prepare两个方法,而创建Looper对象的同时,将会自动创建MessageQueue。

3. 创建好Message Queue后,Looper将自动进入消息循环。此时,Handler自动绑定了主线程的Looper和MessageQueue。

消息入队

工作线程通过Handler发送消息Message到消息队列Message Queue中,消息内容一般是UI操作。发送消息一般都是通过Handler.sendMessage(message)和Handler.post(Runnable)两个方法来进行的。而入队一般是通过MessageQueue.enqueueeMessage(Message,long)来处理。

消息循环

主要分为消息出队和消息分发两个步骤,Looper会通过循环取出消息队列MessageQueue里面的消息Message,并分发到创建该消息的处理者Handler。如果消息循环过程中,消息队列MessageQueue为空队列,则线程阻塞。

消息处理

Handler接收到Looper发来的消息,开始进行处理。

Handler引起的内存泄漏

原因:非静态内部类持有外部类的匿名引用,导致Activity无法释放

解决:

Handler内部持有外部Activity的弱引用

Handler改为静态内部类

Handler.removeCallback()

上一篇下一篇

猜你喜欢

热点阅读