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

【Android 异常与性能优化】Bitmap相关_第1张图片
###LRU 1. 它用来清理最近最少使用对象,其内部是通过LinkedHashMap实现的。它提供了get和put方法来完成对象的添加和获取,当缓存满了它可以提供一个 **trimToSize**方法来清理最近最少使用对象。我们来看下这个方法是如何实现的: ![这里写图片描述](https://img-blog.csdn.net/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.csdn.net/20180219132739575?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) what?从put代码来看,LinkedHashMap中存放的就按存储顺序排序的对象啊。难道不是按使用频繁度排序?频繁度跟什么相关?会不会是在get方法中有重新排序呢?我们来看下get方法。 ![这里写图片描述](https://img-blog.csdn.net/20180219133726978?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 可以看到在get方法中会不光只是从LinkedHashMap中get出一个对象,还把这个对象从LinkedHashMap中取出来放到最后一个位置。由此,使用最频繁的对象就被放到了最后面。 3. 接下来我们看下 **safeSizeOf**是如何实现的呢? ![这里写图片描述](https://img-blog.csdn.net/20180219134150787?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 它其实调用的就是我们熟悉的 **sizeOf**方法。

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

###计算缩略图
根据inSampleSize算出来的值,来相应地保存Bitmap。
【Android 异常与性能优化】Bitmap相关_第3张图片

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

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

你可能感兴趣的:(Android)