1.recycle
一个图片加载到内存里,其实是有两部分数据组成,一部分是图片的相关描述信息,另一部分就是最重要的像素信息(这部分是有byte数组组成的),android系统为了提高对图片的处理效率,对于图片的处理都是调用了底层的功能(由C语言实现的),也就是说一个图片加载到内存里后是使用两部分的内存区域,简单的说:一部分是java可用的内存区,一部分是c可用的内存区,这两个内存区域是不能相互直接使用的,这个bitmap对象是由java分配的,当然不用的时候系统会自动回收了,可是那个对应的C可用的内存区域jvm是不能直接回收的,这个只能调用底层的功能释放。所以你要调用recycle方法来释放那一部分内存。
2.LRU
怎么实现的?
LruCache内部采用一个LinkedHashMap以强引用的方式存储外界提供的缓存对象,提供了put和get方法来添加和获取缓存对象,另外LruCache也是线程安全的。当缓存满时,优先淘汰即删除近期最少使用的缓存对象。
问:如果缓存满了的话,什么方法来管理我们队列的移除最进最少使用的item和添加新的item,
答:trimToSize()方法
3.计算inSampleSize
4.缩略图
缩略图是跟我们的inSampleSize是分不开的,它主要是根据我们inSampleSize算出的值,来响应的保存bitmap到内存当中。
问:这里有一个重要的知识点:inJustDecodeBounds,他是什么原理呢?
答:如果该 值设为true那么将不返回实际的bitmap,也不给其分配内存空间,这样就避免内存溢出了。但是允许我们查询图片的信息这其中就包括图片大小信息。 options.outHeight (图片原始高度)和option.outWidth(图片原始宽度))。Options中有个属性inSampleSize。我们可以充分利用它,实现缩放。
5.三级缓存
答:网络、本地、内存三个层次。
例如你首次打开加载一张图片,首次肯定只能从网络获取,当请求成功,我们会吧图片保存在本地、内存各一份。之后你再次请求同一个url,我们就不用从网络获取了,我们只需要从本地或者内存获取即可。
网络请求:速度最慢。
内存请求:速度最快,也是首先会选择加载的。