1.ANR application not responding
在主线程这做了耗时操作。
主要原因是:应用程序的响应性是Activity Manager和WindowManager系统服务监视的。
(1)主线程被IO操作阻塞;
(2)主线程中存在耗时的计算;
以下这些操作是发生在主线程中:
- Acitivity的所有生命周期回调都是执行在主线程
- Service默认是执行在主线程。
- BroadcastReceivew的onReceive回调是执行在主线程的。
- 没有使用子线程的looper的handler的HandleMessage.Post(Runnable)执行在主线程。
- AnsyncTask的回调中除了doinbackgroun,其他都是执行在主线程。
解决:
- Asynctask处理耗时IO操作
- 使用Thread或HandlerThread提高优先级;
- 使用handler来处理工作线程耗时任务;
2 OOM
当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出out of mermory异常。
容易混淆的概念:
- 内存溢出 OOM 严重会造成程序崩溃
- 内存抖动 在短时间内大量对象被创建,会被马上释放,瞬间产生的对象会占用大量的内存区域,叠加在一起就会触发内存压力,触发gc。
- 内存泄漏 进程中的某些对象,没有被用的,直接间接应用到其他没有回收的对象,导致gc不能起作用。
解决
- bitmap:图片显示,listview滑动的时候不进行网络请求;及时的释放内存;图片压缩;inBitmap属性;捕获异常;
- listview:convertview /LRU最近最少使用;避免在onDraw方法里面创建对象;谨慎使用多进程;
3.bitmap
- recycle
- LRU 最近最少使用三级缓存,LinkedhashMap,缓存满的时候就移除对象,并添加新的对象trimToSize(maxsize)方法;put(),同步代码;removew(key),同步代码;<LRU泛型通过一些方法进行添加删除>
public void trimToSize(int maxSize) {
while (true) {
K key;
V value;
synchronized (this) {
if (size < 0 || (map.isEmpty() && size != 0)) {
throw new IllegalStateException(getClass().getName()
+ ".sizeOf() is reporting inconsistent results!");
}
if (size <= maxSize) {
break;
}
Map.Entry<K, V> toEvict = map.eldest();
if (toEvict == null) {
break;
}
key = toEvict.getKey();
value = toEvict.getValue();
map.remove(key);
size -= safeSizeOf(key, value);
evicti