在 Android 中处理位图和其他图片相关的任务时, Glide 可以完成大部分复杂工作。如果要自己实现缓存Bitmap可以用以下方法。
应用场景
系统通过循环利用移出屏幕的子视图来限制ListView, GridView之类的视图对内存的占用。垃圾回收器假设程序不会保留任何长期的引用,因此也会释放已加载的位图。但是为了确保能够流畅地加载界面,必须避免每次子视图返回到屏幕上时都要处理图片。采用内存和磁盘缓存会让组件快速重新加载经过处理的图片。
使用内存缓存
使用内存缓存位图。LruCache 类非常适用于此任务,原理是将最近引用的对象保持在强引用的LinkedHashMap 中,并且在缓存超出指定大小时移除上次使用时间最早的对象。之所以要保持强引用是因为从API 9开始,垃圾回收器会更积极地回收软引用/弱引用。
LRU缓存的大小需要根据实际使用情况确定:
- 除了图片部分,应用的其他功能需要多少内存?
- 每张图片的分辨率,占用内存等数据。
- 缓存更多低质量位图,在加载时再进行替换?
- 不同图片的访问频率?
将位图加载到 ImageView 时,首先会检查 LruCache。如果找到条目,则会立即使用该条目来更新 ImageView,否则会生成一个后台线程来处理图片。