背景:
只有主线程才可以更新ui,因为为了防止多线程访问变量导致错误的问题,所以更新ui全部是在主线程中。我们可以通过handler 或者view 的post 的方法进行更新,还有runinUiThread等。
github: https://github.com/kodulf/ANRDemo
发生原因:
主线程执行时间超过5秒钟,broadcast 的onReceiver 方法执行超过了10秒钟,service 执行时间超过了15秒
Activity----->5秒
Broadcast----->10秒
Service----->20秒
会报ANR,都是在主线程中运行的
可能是下载的操作是在主线程直接进行操作了,例如broadcast的onreceiver 里面执行的时间太长了,service
举个例子:
比方kfc, 前面点餐员,如果你还让点餐员去给你拿餐,人少的时候还可以,可以快速的响应你,如果人多的时候,那么,可能就会出现后台做不过来,需要点餐员在那边等着然后才能给你拿。
正确的做法应该是,点餐员就负责给你点餐,然后后面有专门的人负责给你去餐,点完餐在旁边等待就好了,不要打扰后面的人点餐。
解决思路:
1: 当前的怎么check log
如果出现了anr,那么会有两个地方的log,
1.1 首先就是logcat 里面的log,我们可以定位到线程