[转发]Android 系统稳定性 - ANR(三)
文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任。
很久之前写的了,留着有点浪费,共享之。
编写者:李文栋
http://rayleeya.iteye.com/blog/1956056
1.4 如何避免ANR
1.4.1 ANR发生在主线程,不要阻塞主线程
Android应用程序的所有标准组件全部运行在一个单一的主线程中,在主线程中所做的任何耗时的操作都有可能造成ANR,因为这些耗时的操作会使得主线程没有机会处理用户输入事件或者广播事件。
因此在主线程中执行的任何函数所做的工作都应该尽可能的少,特别是对于Activity的生命周期函数来说。网络和数据库操作,以及诸如位图变换的一些耗时的操作,都应该放在子线程中完成。主线程不需要等待子线程的执行,主线程应该创建一个与其绑定的Handler对象,子线程执行完毕后通过Handler通知主线程。
创建子线程的方式有很多,Android中提供了很多相关的API,例如HandlerThread、AsyncTask、AsyncQueryHandler等,当然也可以创建简单的线程或线程池。不过需要注意的是,不要制造太多的“野”线程,例如在Android原生代码中经常会见到在某个函数中new了一个Thread对象,调用其start函数启动后就不再管理了。笔者对这种写法并不认同,这种写法的优点是避免了子线程对某些对象的强引用,以免内存泄漏,但是反而有潜在的风险会造成“线程泄漏”,也就是说可能会多次执行相同的操作创建大量的子线程,而这些子线程很可能由于某种原因被阻塞而都无法正常退出,大量的线程本身就会占用内存和CPU,抢占临界资源,而且执行的多是重复的操作。所以笔者建议将子线程“管理”起来,无论是用标志位还是用成员变量,总之不要让线程随意的被创建,用有限数量的线程或线程池处理所有的请求,可以用Handler将请求队列化,去除重复的请求减少资源浪费,同时应该在适当的时候(例如Activity销毁时)考虑停止子线程,避免不必要的操作和内存泄漏。
BroadcastReceiver通常是用来在后台执行一些小型的、琐碎的工作,例如保存程序设置。不要在BR中执行需要长时间运行的操作,这些操作应该放到Serivce中。另外,不要在BR中启动一个Activity,因为那样会创建一个新的窗口,新窗口会抢夺屏幕焦点,用户原先正在交互的窗口失去焦点后就不会再接收到输入事件。新窗口的突然出现可能会让用户很诧异,或者也有可能出现由于旧窗口的层(Window的type属性)比较高,新窗口没能显示,但是输入事件又被新窗口抢夺的情况。如果在BR中有消息要提示用户,可以考虑使用NotificationManager在状态栏中显示通知来达到目的。
1.4.2 消除停顿感
通常人们感知界面有停顿感的时间需要100到200毫秒,所以为了给用户更好的体验,在避免ANR的基础上更进一步来消除停顿感,有以下几个建议:
如果应用程序正在后台执行耗时工作,可以使用ProgressBar或者ProgressDialog来提示用户工作进度;
对于游戏类的应用,应该使用子线程去做位置计算;
如果应用程序的初始化过程比较耗时,可以在初始化时显示一个过场动画或者图片,也可以先快速的显示主界面然后再异步的加载初始化数据。
[转发]Android 系统稳定性 - ANR(三)的更多相关文章
- [转发]Android 系统稳定性 - ANR(二)
文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任. 很久之前写的了,留着有点浪费,共享之.编写者:李文栋P.S. OpenOffice粘贴过来后格式有些混乱. http://rayleeya ...
- [转发]Android 系统稳定性 - ANR(一)
文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任.很久之前写的了,留着有点浪费,共享之.编写者:李文栋 http://rayleeya.iteye.com/blog/1955652 如果你 ...
- Android 系统稳定性 - ANR(二)(转)
编写者:李文栋P.S. OpenOffice粘贴过来后格式有些混乱. 1.2 如何分析ANR问题 引起ANR问题的根本原因,总的来说可以归纳为两类: 应用进程自身引起的,例如: 主线程阻塞.挂起.死循 ...
- 【原创】Android 系统稳定性 - ANR(二)
文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任. 很久之前写的了,留着有点浪费,共享之.编写者:李文栋P.S. OpenOffice粘贴过来后格式有些混乱. 1.2 如何分析ANR问题 引 ...
- Android 系统稳定性 - ANR(一)
文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任.很久之前写的了,留着有点浪费,共享之.编写者:李文栋 如果你是一个Android应用程序开发人员,你的人生中不可避免的三件事情是:死亡.缴 ...
- [转]Android各大网络请求库的比较及实战
自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个.本篇文章对常见的网络请求库进行一个总结. HttpUrlConnection ...
- [原创]Mac系统下制作OS 10.11安装镜像
一.所需软件 1.从App Store下载OS X El Capitan 10.11.2 ------------------------------------------------------- ...
- [转载]—— Android JNI知识点
Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...
- [转]获得 LayoutInflater 实例的三种方式
转自:http://www.cnblogs.com/androidez/archive/2013/07/01/3164729.html 获得 LayoutInflater 实例的三种方式 在实际开 ...
随机推荐
- python之常见的坑
li = [1,2,3,4] # [1,3,4] # 索引值是奇数的删除 for i in range(4): if i % 2 == 1: li.pop(i) # 会报错 print(li) 面试题 ...
- QT5:先导篇 全局定义
一.简介 <QtGlobal>头文件包含了Qt类库的一些全局定义,包含基本数据类型 函数和宏 二.全局变量定义 <QtGlobal>定义的数据类型: Qt数据类型 ...
- [POJ]1111 Image Perimeters
Description Technicians in a pathology lab analyze digitized images of slides. Objects on a slide ar ...
- 哪些 Python 库让你相见恨晚?
知乎用户,A European Swallow. 苇叶.Aran He.jerry等人赞同 补充三个有助于自动化日常工作的: sh:sh 1.08 — sh v1.08 documentation可以 ...
- 蓝牙学习(2)USB Adapter
主要分析一下蓝牙USB Adapter使用USB接口传输HCI包的实现及过程. 参照上面的Bluetooth core system architecture图, 蓝牙USB Adapter作为Blu ...
- python--MySQL权限管理 数据备份还原
一 权限管理 mysql最高管理者是root用户, 这个一般掌握在公司DBA手里, 当你想去对数据库进行一些操作的时候,需要DBA授权给你. 1. 对新用户增删改 1. 创建用户 # 要先use my ...
- Python中正则表达式讲解
正则表达式是匹配字符串的强大武器,它的核心思想是给字符串定义规则,凡是符合规则的字符串就是匹配了,否则就是不合法的.在介绍Python的用法之前,我们先讲解一下正则表达式的规则,然后再介绍在Pytho ...
- 关于awk中NR、FNR、NF、$NF、FS、OFS的说明
一.NR和FNR 1.释义 NR: 表示当前读取的行数 FNR:当前修改了多少行 2.举例 比如现在AWK处理到第五行.第一行没有进行操作,2,3,4,5行进行了操作,那么NR=5,FNR=4 NR= ...
- 【编程工具】Sublime Text3 之 Emmet 插件的详细使用的方法
这篇关于 Emmet 插件使用的博文之前就想写了,今天刚好闲暇时间,就花了一些时间进行了总结. 我们都这道 Emmet 这款插件在前端设计里被称为神器,确实,神器称号名不虚传.因为这款插件可以帮助我们 ...
- HDU 4426 Palindromic Substring
Palindromic Substring Time Limit: 10000ms Memory Limit: 65536KB This problem will be judged on HDU. ...