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

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

LRU

  1. 它用来清理最近最少使用对象,其内部是通过LinkedHashMap实现的。它提供了get和put方法来完成对象的添加和获取,当缓存满了它可以提供一个trimToSize方法来清理最近最少使用对象。我们来看下这个方法是如何实现的:
    【Android 异常与性能优化】Bitmap相关
  2. 可以看到这个方法会一直循环判断size是否小于maxSize,如果不小于maxSize,则会从LinkedHashMap中依次remove下一个元素,并调用safeSizeOf重新计算size。从这里可以看出,LinkedHashMap中按顺序存放着使用从最不频繁到最频繁的对象。那么怎么知道对象使用频繁还是不频繁呢?我们看下put方法是如何实现的?
    【Android 异常与性能优化】Bitmap相关
    what?从put代码来看,LinkedHashMap中存放的就按存储顺序排序的对象啊。难道不是按使用频繁度排序?频繁度跟什么相关?会不会是在get方法中有重新排序呢?我们来看下get方法。
    【Android 异常与性能优化】Bitmap相关
    可以看到在get方法中会不光只是从LinkedHashMap中get出一个对象,还把这个对象从LinkedHashMap中取出来放到最后一个位置。由此,使用最频繁的对象就被放到了最后面。
  3. 接下来我们看下safeSizeOf是如何实现的呢?
    【Android 异常与性能优化】Bitmap相关
    它其实调用的就是我们熟悉的sizeOf方法。

计算inSampleSize

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

计算缩略图

根据inSampleSize算出来的值,来相应地保存Bitmap。
【Android 异常与性能优化】Bitmap相关

三级缓存

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

最后

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