您的位置:首页 > 移动开发 > Android开发

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

2018-02-19 14:01 387 查看

LRU

它用来清理最近最少使用对象,其内部是通过LinkedHashMap实现的。它提供了get和put方法来完成对象的添加和获取,当缓存满了它可以提供一个trimToSize方法来清理最近最少使用对象。我们来看下这个方法是如何实现的:



可以看到这个方法会一直循环判断size是否小于maxSize,如果不小于maxSize,则会从LinkedHashMap中依次remove下一个元素,并调用safeSizeOf重新计算size。从这里可以看出,LinkedHashMap中按顺序存放着使用从最不频繁到最频繁的对象。那么怎么知道对象使用频繁还是不频繁呢?我们看下put方法是如何实现的?



what?从put代码来看,LinkedHashMap中存放的就按存储顺序排序的对象啊。难道不是按使用频繁度排序?频繁度跟什么相关?会不会是在get方法中有重新排序呢?我们来看下get方法。



可以看到在get方法中会不光只是从LinkedHashMap中get出一个对象,还把这个对象从LinkedHashMap中取出来放到最后一个位置。由此,使用最频繁的对象就被放到了最后面。

接下来我们看下safeSizeOf是如何实现的呢?



它其实调用的就是我们熟悉的sizeOf方法。

计算inSampleSize

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



计算缩略图

根据inSampleSize算出来的值,来相应地保存Bitmap。



三级缓存

包括:网络、本地、内存三级缓存。它的原理是:

当用户首次打开app从网络上去获取,当获取完成后,把结果保存到sd卡和内存当中。

最后

以上就是我总结的Bitmap优化的知识,后续还会陆续更新,如有任何疑问欢迎留言提问,博主每天都会查看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: