美文网首页安卓考点脉络
【开源库内部是如何工作的】图片加载

【开源库内部是如何工作的】图片加载

作者: 小呀么小黄鸡 | 来源:发表于2018-02-24 09:47 被阅读8次

    1开源库内部是如何工作的 处理关键数据使用的方法有什么惊艳的地方 简单来说imageloder怎么做缓存的,缓存算法有哪些,lru的特性是什么,为什么用linkedhashmap实现

    ImageLoader----内存缓存篇一

    BaseMemoryCache

    BaseMemoryCache直接继承于MemoryCache,内部的实现是用一个HashMap通过key-value的形式将一个bitmap的软引用保存在内存当中,当再次使用图片的时候可以直接从内存中获取,当内存不足时软引用被回收返回null。这时从本地缓存中读取图片,如如果本地缓存没有就从网络中获取图片,将图片以软引用的方式保存在hashmap中同时保存到本地缓存,这样就起到了简单的内存缓存效果

    LruMemoryCache(LRU算法)

    LRU是LeastRecentlyUsed近期最少使用算法。内存管理的一种页面置换算法。在内存中但又不用的数据块(内存块)叫做LRU,算法会将属于LRU的数据移出内存而腾出空间来加载新数据。

    如何实现:以图片缓存为例,整体思路是给内存中的缓存设定一个最大值,在缓存图片的时候来管理图片缓存的总大小,当缓存图片超过了最大值就删除使用最少的图片。具体方式是用一个LinkedHashMap将要缓存的bitmap直接保存在内存当中,put方法在保存图片之前先计算出这张图片的大小并累加到size变量上,图片保存后判断之前是否以同样的key保存了图片并减去之前的bitmap的大小。(map.put返回值为以前与该 key 关联的value)之后就要管理缓存了。如果当前缓存的bitmap空间即size小于设定值maxSize,不做任何处理,如果当前缓存的bitmap空间大于maxSize,删除LinkedHashMap中的第一个元素(因为每次put/get后都会把元素放到map尾部),size中减去该bitmap对应的byte数。

    假设 序列为 4 3 4 2 3 1 4 2
    物理块有3个 则
    首轮 4调入内存 4
    次轮 3调入内存 3 4
    之后 4调入内存 4 3
    之后 2调入内存 2 4 3
    之后 3调入内存 3 2 4
    之后 1调入内存 1 3 2(因为最少使用的是4,所以丢弃4)
    之后 4调入内存 4 1 3(原理同上)
    最后 2调入内存 2 4 1

    LRU算法的缺点在于实现方法的不足——效率高的硬件算法通常在大多数机器上无法运行,而软件算法明显有 太多的开销。与之相对的,FIFO算法,和与LRU相似的NRU算法,性能尽管不是最好,却更容易实现。所以,找到一个优秀的算法来实现LRU,就是一个 非常有意义的问题

    相关文章

      网友评论

        本文标题:【开源库内部是如何工作的】图片加载

        本文链接:https://www.haomeiwen.com/subject/pgjczxtx.html