Android知识点总结(二)

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值