文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任。 
很久之前写的了,留着有点浪费,共享之。 
编写者:李文栋 

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(三)的更多相关文章

  1. [转发]Android 系统稳定性 - ANR(二)

    文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任. 很久之前写的了,留着有点浪费,共享之.编写者:李文栋P.S. OpenOffice粘贴过来后格式有些混乱. http://rayleeya ...

  2. [转发]Android 系统稳定性 - ANR(一)

    文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任.很久之前写的了,留着有点浪费,共享之.编写者:李文栋  http://rayleeya.iteye.com/blog/1955652 如果你 ...

  3. Android 系统稳定性 - ANR(二)(转)

    编写者:李文栋P.S. OpenOffice粘贴过来后格式有些混乱. 1.2 如何分析ANR问题 引起ANR问题的根本原因,总的来说可以归纳为两类: 应用进程自身引起的,例如: 主线程阻塞.挂起.死循 ...

  4. 【原创】Android 系统稳定性 - ANR(二)

    文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任. 很久之前写的了,留着有点浪费,共享之.编写者:李文栋P.S. OpenOffice粘贴过来后格式有些混乱. 1.2 如何分析ANR问题 引 ...

  5. Android 系统稳定性 - ANR(一)

    文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任.很久之前写的了,留着有点浪费,共享之.编写者:李文栋  如果你是一个Android应用程序开发人员,你的人生中不可避免的三件事情是:死亡.缴 ...

  6. [转]Android各大网络请求库的比较及实战

    自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个.本篇文章对常见的网络请求库进行一个总结. HttpUrlConnection ...

  7. [原创]Mac系统下制作OS 10.11安装镜像

    一.所需软件 1.从App Store下载OS X El Capitan 10.11.2 ------------------------------------------------------- ...

  8. [转载]—— Android JNI知识点

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...

  9. [转]获得 LayoutInflater 实例的三种方式

    转自:http://www.cnblogs.com/androidez/archive/2013/07/01/3164729.html 获得 LayoutInflater 实例的三种方式   在实际开 ...

随机推荐

  1. 获取url请求的参数值

    function getURLParameter(name) { return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '( ...

  2. OS X快捷键小技巧

    退出command+Q,关分页Command+W,刷新Command+R,新开分页Command+T 全屏 ctrl+command+F 每个Mac使用者都知道点击下窗口左上角黄色圆形的按钮就可以最小 ...

  3. 第九次第十次作业 网页设计HTML语言之mp3 与mp4音频与视频两次作业,功能在一起也可

    参考的网址是: MP3 参考http://www.cnblogs.com/qingyundian/p/7831098.html MP4参考 http://www.cnblogs.com/qingyun ...

  4. TCP/IP各种数据包结构体

    下面这些TCP/IP数据包是我在进行Socket及Wipcap网络编程过程中曾经用到过的数据包结构体, 这些东西平时看起来不起眼,真正用到的时候就会觉得非常有用...... 以太帧头格式结构体,共14 ...

  5. Cocos2d-X研究之3.0 场景切换特效汇总

    Cocos2d-X研究之3.0 场景切换特效汇总 2014-08-05      0个评论    来源:游戏编程    收藏    我要投稿 cocos2d-x 3.0中场景切换特效比较多,而且游戏开 ...

  6. CF-1096C Polygon for the Angle

    CF-1096C Polygon for the Angle https://codeforces.com/contest/1096/problem/C 题意:给一个角度ang(1<=ang&l ...

  7. [LUOGU] P2679 子串

    一开始用一个f数组转移,发现不太对,状态有重叠部分 f[i][j][k]表示考虑了s的前i位,匹配到t的第j位,用了k个子串,且s的第i位必选 g[i][j][k]表示考虑了s的前i位,匹配到t的第j ...

  8. Linux菜鸟起飞之路【二】Linux基本常识

    一.Unix操作系统基本常识 1.什么是Unix? Unix是一个计算机操作系统,是一个用来协调.管理和控制计算机硬件与软件资源的控制程序. 2.Unix操作系统的特点? 多用户与多任务.多用户表示在 ...

  9. break、continue、exit、return的区别和对比

    break.continue.exit.return的区别和对比 一:说明 break.continue在条件循环语句及循环语句(for.while.if等)中用于控制程序的走向:而exit则用于种植 ...

  10. input标签内容改变触发的事件

    原生方法 onchange事件 <input type="text" onchange="onc(this)"> function onc(data ...