bitmap

1、Recycler

        当bitmap要被回收的时候,要分两部分回收,一部分是Java中的内存,另一部分是native中的内存。

        在释放bitmap内存的时候,会释放和这个bimap有关的内存同时清理数据对象的引用但是这里处理对象的引用不是立即清理数据,就是说当你调用Recycler方法时并不会直接清理native的内存,只是给gc发送一个指令,让他在其他没有引用这个bitmap对象的时候进行垃圾回收。当recycler方法执行之后该bitmap就会标为“dead”状态了,这个时候在调用bitmap相关的其他方法就会引起异常。这个操作时不可逆的,要确定这个bitmap在以后场景中不会再被使用到再谨慎调用这个方法。google建议我们不要主动调用recycler方法,因为gc当没有其他对象指向该bitmap的时候会主动清理内存。但是平时可以根据特定的场景主动的调用recycler方法。

2、LRU

        LRU算法主要用于存储bitmap时三级缓存使用。LRU算法意思是最近最少使用的对象会把它清除。

        内部使用LinkHashMap来实现,里面提供有get、put方法来完成缓存的添加和获取操作,当缓存满的时候LRU算法提供一个trimToSize方法把较早的缓存对象移除,然后添加新的缓存对象。

        bitmap_第1张图片

        在同步代码块的第二个if中判断如果里面的元素小于或等于最大值,就跳出循环。

        下面的操作是先把一个元素移除,在使用safeSizeOf方法计算大小。

3、计算inSampleSize

        当图片过大的时候,就就不应该加载到Bitmap中,否则会出现OOM。

        bitmap_第2张图片

        首先会计算我们原始的长宽,默认吧inSampleSize比例设为1。下面的判断计算出一个我们期望的缩减比例比例。

4、缩略图

        缩略图跟上述的inSampleSize缩减比例是分不开的,主要是用inSampleSize算出来的值来相应的保存bitmap到内存中。

bitmap_第3张图片

    方法体内有一个非常重要的属性 potions.inJustDecodeBounds 属性这个属性是BitmapFactory.Options里面传递过来的,获取图片的宽高,这里要设置Options.inJustDecodeBounds=true,这时候decode的bitmap为null,只是把图片的宽高放在Options里,然后第二步就是设置合适的压缩比例inSampleSize。最后完成合适的缩放比例。

        bitmap_第4张图片

5、三级缓存

        如果每次启动都要从网络获取图片的话,肯定会消耗用户的流量。所以在这个问题中就出现了三级缓存的概念。

        三级分别是:网络本地内存

        原理也很简单,首次打开app的话图片肯定要从网络获取,当从网络上加载好图片后,把图片保存到SD卡和相应的内存当中各一份。再次请求同样url这个bitmap的时候就不用通过网络获取了,直接从本地内存当中获取。

你可能感兴趣的:(android学习)