Crash
.闪退(Crash)是客户端程序在运行时遭遇无法处理的异常或错误时而退出应用程序的表现,请从crash发生的原因分类与解决方法、
在出现crash后如何捕捉并分析异常这两个问题给出自己的解决方案
原因分类
- 虚拟机Error:一些虚拟机无法处理而抛出的异常,比如常见的stackoverflow和oom
- RuntimeException:比如常见的NullPointException、ArrayIndexOutOfBoundException和ClassNotFoundException等
- 非运行异常:比如FileNotFoundException
- Android特有属性:比如使用主线程进行耗时操作,比如网络请求
解决方案
正确并有效地使用异常:
具体明确地抛出异常,而不是为了简单抛出一个Exception;
提早抛出异常,比如在文件操作时,需要对filename进行检查;
延迟捕获,不要过早地吃掉异常使用Android进程中的UnCaughtExceptionHandler(未捕获异常处理器)对象
自定义一个UncaughtExceptionHandler对象,并设置为当前进程的UncaughtExceptionHandler对象,重写UncaughtExceptionHandler
方法来在闪退前获取导致闪退异常的详细信息。使用第三方解决方案:比如Bugly、ACRA等。
OOM
APP发生OOM的原因以及如何避免
1.内存压力过大
- 加载大量图片,导致内存不足: 对图片进行压缩,并采用软引用方法
- 重复创建大量的view,比如listview的使用convertview和viewHolder
2.作用域不同,导致垃圾回收器无法回收
- 非静态内部类隐性持有外部类的引用
- context泄露:不要对Context-Activity长时间的引用(若要使用,必须保证和activity相同的生命周期);尽量用Application-Context;
3. 资源对象没有关闭
- 常见的资源对象比如cursor, stream
- bitmap对象使用后不回收
- 调用registerReceiver后,销毁活动时没有调用un方法。
如何避免内存泄露
- 使用缓存技术,比如LruCache或DiskLruCache,对象重复并频繁创建时使用对象池,比如Volley源码中定义ByteArrayPool作为byte数组的缓存池
- 对于引用生命周期不同的对象,采用软引用或弱引用
- 对于资源对象,一定要关闭
- 内存压力过大,就需要统一管理内存