缓存机制
-
二级缓存:内存 -> 硬盘 -> 网络
当查找数据时,先从内存中查找,若无则查找硬盘,若无再请求网络
当从网络获取数据后,同时存储到内存和硬盘中
缓存框架
- LruCache 内存缓存 DiskLruCache 硬盘缓存
- ASimpleCache(ACache)
- RxCache
缓存机制
- 类似Glide之类的大型框架都是使用自己的缓存机制
- 类似Message里面的缓存就运用了享元池
对象池若一开始为空时,则只返回一个Message对象,消息被回收时,调用recycle()回收方法,会初始化对象池,然后消息被清除数据并且加入到链表的头部// sometimes we store linked lists of these things // 指向对象池下一个对象的指针 /*package*/ Message next; // 对象池的锁,互斥访问 private static final Object sPoolSync = new Object(); // sPool始终指向链表队首 private static Message sPool; // 当前链表数据量 private static int sPoolSize = 0; // 对象池容量 private static final int MAX_POOL_SIZE = 50; /** * Return a new Message instance from the global pool. Allows us to * avoid allocating new objects in many cases. */ public static Message obtain() { synchronized (sPoolSync) { if (sPool != null) { Message m = sPool; sPool = m.next; m.next = null; m.flags = 0; // clear in-use flag sPoolSize--; return m; } } return new Message(); }
synchronized (sPoolSync) { if (sPoolSize < MAX_POOL_SIZE) { next = sPool; sPool = this; sPoolSize++; } }
- 在Message中,享元模式的具体实现是链表,而其它使用场景中,缓存对象的容器实际上是可以随便切换的,例如你想用HashMap之类的也是可以的。