Android面试复习-Handler
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()