BroadCastReceiver中耗时操作导致ANR
現象:廣播接收器中進行耗時的I/O操作導致ANR。
查資料發現每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后
该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在
BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(Application No Response) 的对话框.
解決辦法:
① 在API11之前,如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束 BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver
的 所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的(API11之前)
② API11以後可以調用goAsync()方法,這個方法會返回一個PendingResult對象,android系統會認為OnReceive()方法還沒有執行完成直到調用PendingResult.finish(),所以可以調用goAsync方法后,新开一个线程去执行耗時操作,執行完后調用PendingResult.finish()方法。這裡耗時的操作也不能超過10秒
最新文章
- shell——awk
- python字符串
- 【代码笔记】iOS-点击任何处,显示出红色的UIView
- html5 Canvas绘制图形入门详解
- poj-3739. Special Squares(二维前缀和)
- http模式
- db2新建数据库
- asp.net ajax 调用错误解决
- 云计算服务模型,第 3 部分: 软件即服务(PaaS)
- Zabbix探索:网络设备监控2
- ios 运行模式
- ZOJ 1203 Swordfish 旗鱼 最小生成树,Kruskal算法
- Java入门——(3)面对对象(下)
- Java基础系列-Comparable和Comparator
- gzip对字符串的压缩和解压
- c++のmap的遍历
- 复杂HTML解析
- mysql 权限管理 目录
- 《Netty权威指南》(一)走进 Java NIO
- linux操作系统1 Linux入门