Handler 原理总结

Android应用是基于消息发送模型,如生命周期回调、用户输入等都是通过发送消息到消息队列,然后再有序进行处理
Handler:发送消息和处理事件
Looper:循环监听消息并分发到Handler进行处理
MessageQueue:消息队列,所有发送的消息都会添加到这里

处理过程:
Looper.loop()是一个无限循环体,进入循环后判断消息队列是否有消息未处理,有未处理消息则分发,无消息时进入空闲等待状态,直到有消息进入(原理是通过监听管道两端,如果一端有数据写入,则唤醒另外一端,这个过程应该和线程的阻塞比较相似,释放了cpu)
Handler发送消息到MessageQueue,Looper监听到消息队列有消息未处理,读取并分发给Handler(调用dispatchMessage方法处理),这一过程是在Handler所在线程处理。Handler处理完事件后,Looper又读取下一条消息
这里写图片描述

Handler在Android中应用很广,如异步线程AsyncTask的publishProgress()和onPostExecute()在主线程中执行,原理也是通过Handler来实现的;如CountDownTimer的倒计时逻辑也是通过Handler实现

在应用程序的启动过程中,AMS加载ActivityThread后会执行其main方法,
这里写图片描述
在prepareMainLooper方法中会创建一个sMainLooper对象,接着创建一个ssMainThreadHandler对象,接着调用loop()方法进入一个循环。也就是在主线程已经创建了一个Handler,这个Handler起什么作用呢?
Android应用程序都是基于消息通讯模型的,应用程序在启动过程中、各个回调方法的执行、后续用户的UI操作等,应用程序并不直接调用相应的方法,而是将封装成一条消息发送到消息队列,而后再处理

在线程中创建Handler之前先要调用Looper.prepare()方法为当前线程生成一个Looper对象,此时Handler运行在当前线程中

问题:
1.为什么Looper.loop()中的Message msg = queue.next(); // might block不会使应用程序报ANR异常?

2.ANR是如何监听主线程?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值