現象:廣播接收器中進行耗時的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秒

最新文章

  1. shell——awk
  2. python字符串
  3. 【代码笔记】iOS-点击任何处,显示出红色的UIView
  4. html5 Canvas绘制图形入门详解
  5. poj-3739. Special Squares(二维前缀和)
  6. http模式
  7. db2新建数据库
  8. asp.net ajax 调用错误解决
  9. 云计算服务模型,第 3 部分: 软件即服务(PaaS)
  10. Zabbix探索:网络设备监控2
  11. ios 运行模式
  12. ZOJ 1203 Swordfish 旗鱼 最小生成树,Kruskal算法
  13. Java入门——(3)面对对象(下)
  14. Java基础系列-Comparable和Comparator
  15. gzip对字符串的压缩和解压
  16. c++のmap的遍历
  17. 复杂HTML解析
  18. mysql 权限管理 目录
  19. 《Netty权威指南》(一)走进 Java NIO
  20. linux操作系统1 Linux入门

热门文章

  1. (转)十分钟搞定CSS选择器
  2. java中split以"."分割的问题
  3. dynamic关键字
  4. 一个fibonacci数列简单求和的问题
  5. css样式 第6节
  6. java web 文件上传下载
  7. 两款web api 调试工具
  8. IOS 学习笔记 2015-04-09 0C-SQLite 数据存储
  9. 【原创】Linux 内核模块编程
  10. jQuery学习 day01