【Android 异常与性能优化】Bitmap相关

###LRU 1. 它用来清理最近最少使用对象,其内部是通过LinkedHashMap实现的。它提供了get和put方法来完成对象的添加和获取,当缓存满了它可以提供一个**trimToSize**方法来清理最近最少使用对象。我们来看下这个方法是如何实现的: ![这里写图片描述](https://img-blog.youkuaiyun.com/20180219131416585?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 2. 可以看到这个方法会一直循环判断size是否小于maxSize,如果不小于maxSize,则会从LinkedHashMap中依次remove下一个元素,并调用**safeSizeOf**重新计算size。从这里可以看出,**LinkedHashMap中按顺序存放着使用从最不频繁到最频繁的对象**。那么怎么知道对象使用频繁还是不频繁呢?我们看下put方法是如何实现的? ![这里写图片描述](https://img-blog.youkuaiyun.com/20180219132739575?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) what?从put代码来看,LinkedHashMap中存放的就按存储顺序排序的对象啊。难道不是按使用频繁度排序?频繁度跟什么相关?会不会是在get方法中有重新排序呢?我们来看下get方法。 ![这里写图片描述](https://img-blog.youkuaiyun.com/20180219133726978?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 可以看到在get方法中会不光只是从LinkedHashMap中get出一个对象,还把这个对象从LinkedHashMap中取出来放到最后一个位置。由此,使用最频繁的对象就被放到了最后面。 3. 接下来我们看下**safeSizeOf**是如何实现的呢? ![这里写图片描述](https://img-blog.youkuaiyun.com/20180219134150787?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 它其实调用的就是我们熟悉的**sizeOf**方法。

###计算inSampleSize
我们知道Bitmap节省内存有很多种方法,其核心无非就是在合适的时机加载合适大小的Bitmap。现在的照片越来越大,如果把这些大图直接加载到内存当中,很容易内存溢出。下面我们来看下如何得到Bitmap缩减比例。
这里写图片描述

###计算缩略图
根据inSampleSize算出来的值,来相应地保存Bitmap。
这里写图片描述

###三级缓存
包括:网络、本地、内存三级缓存。它的原理是:
当用户首次打开app从网络上去获取,当获取完成后,把结果保存到sd卡和内存当中。

###最后
以上就是我总结的Bitmap优化的知识,后续还会陆续更新,如有任何疑问欢迎留言提问,博主每天都会查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值