android ANR应用无响应

ANR是ApplicationNotResponding的缩写,当主线程在5秒内未能处理按键或触摸事件,10秒内BroadcastReceiver未完成处理,或20秒内Service未响应时会发生。主要原因是主线程被长时间占用,导致UI更新阻塞。避免ANR的关键在于将耗时操作移出主线程,如使用单独线程进行数据库和网络操作,以及通过Handler处理UI与工作线程的交互。
摘要由CSDN通过智能技术生成

ANR (Application Not Responding)

1). Key Dispatch Timeout (8s)

framework/base/services/core/java/com/android/server/am/ActivityManagerService.java

按键或触摸事件在特定时间内无响应(origin:5s)

KEY_DISPATCHING_TIMEOUT = 8*1000

2) .Broadcast Timeout

BroadcastReceiver在特定时间内无法处理完成

BROADCAST_FG_TIMEOUT: 10s

BROADCAST_BG_TIMEOUT: 60s

按键和广播事件时间内未响应,时间限定定义在ActivityManagerService.java类中

3).Service Timeout (20s)——-小概率类型

Service在特定的时间内无法处理完成

service时间内未响应时间限定在ActiveServices.java类中

SERVICE_TIMEOUT = 20*1000;

2.ANR产生原因

1)应用进程有一个主线程(main thread)和一个信息队列(main message queue) main thead == activity thread

2)主线程负责处理像Draw、Listen、receive等UI事件

3)主线程负责从消息队列中取出信息并分发它

4)主线程在完成当前信息处理之前,不会再取信息队列中的信息

5)如果主线程在处理当前信息时卡住,没有及时分发,ANR就会出现

3.如何避免ANR

1):UI线程尽量只做跟UI相关的工作

2):耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理

3):尽量用Handler来处理UIthread和别的thread之间的交互

4.UI线程主要包括哪些?

1).Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick()等

2).AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel等

3).Mainthread handler: handleMessage(), post*(runnable r)等

4).other

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值