[转发]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 实例的三种方式 在实际开 ...
随机推荐
- 解决因为手机设置字体大小导致h5页面在webview中变形的BUG
首先,我们做了一个H5页面,在各种手机浏览器中打开都没问题.我们采用了rem单位进行布局,通过JS来动态计算网页的视窗宽度,动态设置html的font-size,一切都比较完美. 这时候,你自信满满的 ...
- PyTorch在NLP任务中使用预训练词向量
在使用pytorch或tensorflow等神经网络框架进行nlp任务的处理时,可以通过对应的Embedding层做词向量的处理,更多的时候,使用预训练好的词向量会带来更优的性能.下面分别介绍使用ge ...
- 转: opencv4.0.0 +opencv_contrib在vs2015中编译
https://blog.csdn.net/baidu_40691432/article/details/84957737
- 【实用工具】Teleport Pro爬取整个网站镜像到本地
1. 使用Teleport Pro可以完全或部分下载一个网站上的内容,在硬盘上创建一个与原网站完全相同的镜象,使用户能够离线浏览 Teleport Pro的安装以及基本使用 在菜单栏Project下得 ...
- 【Linux】VirtualBox虚拟网络配置
Host OS : Windows 10 Guest OS : CentOS 6.8 VirtualBox:5.1.18 网络连接方式: NAT 1.CentOS中使用DHCP [root@gouka ...
- html块级元素和行级元素的区别和使用
行内.块状元素区别: 1.行内元素与块级函数可以相互转换,通过修改display属性值来切换块级元素和行内元素,行内元素display:inline,块级元素display:block. 2.行内元素 ...
- Python3与SQLServer、Oracle、MySql的连接方法
环境: python3.4 64bit pycharm2018社区版 64bit Oracle 11 64bit SQLServer· Mysql 其中三种不同的数据库安装在不同的服务器上,通过局域网 ...
- Python9-面对对象2-day23
#计算正方形的周长和面积 class Square: def __init__(self,side_len): self.side_len = side_len def perimeter(self) ...
- 快速入门Sklearn
主要确定sklearn的基本流程,然后把sklearn当做螺丝刀来用就行了,需要什么查什么. 基本流程 首先我们回顾一下机器学习的基本流程: 特征工程,包括了数据清洗,数据标准版化,特征选取,特征降维 ...
- luogu2569 [SCOI2010]股票交易
题解看这里 #include <iostream> #include <cstring> #include <cstdio> using namespace std ...