Android anr和oom

anr

引发anr原因

  • antivity所有生命周期回调都是在主线程中操作的
  • service默认在主线程中操作的
  • BroadcastReceiver中的onReceive回调执行在主线程中
  • 没有关联子线程的looper也是执行在主线程中的
  • asynctask除了doInbackground都是执行在主线程中

解决anr

  • 使用asynctask处理IO操作
  • 使用thread和handlerThread提高优先级
  • 使用handler来处理工作线程的耗时任务
  • 避免activity中的oncreate和onresum的耗时任务

oom

引发oom原因

  • 正在使用的内存加上当前需要申请的内存超过了虚拟机的最大内存限制造成oom
  • 内存泄漏导致gc无法回收掉不再使用的对象造成内存被一直占据。

解决oom

  • 显示图片不加载大图 显示缩略图
  • 及时释放bitmap c区的内存不仅仅是java区内存
  • inbitmap属性重新使用原来bitmap的内存区域
  • 捕获异常
  • listview convertview lru三级缓存机制 避免ondraw执行对象创建
  • 避免使用多进程
    原文作者:Super_me14
    原文地址: https://www.jianshu.com/p/0d281dcf5f1c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞