LruCache和DiskLruCache实现二级缓存的自定义ImageLoader
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
在Android开发中,图片加载是应用性能优化的关键环节。为了提高用户体验,开发者通常会采用缓存机制来存储图片,减少网络请求,加快图片显示速度。本文将深入探讨如何使用`LruCache`和`DiskLruCache`实现一个二级缓存的自定义`ImageLoader`。 `LruCache`是Android SDK提供的内存缓存解决方案,全称为"Least Recently Used Cache"(最近最少使用缓存)。它的原理是当缓存容量达到上限时,优先淘汰最近最少使用的数据。这种策略可以确保内存中的数据具有较高的活性,从而降低因频繁GC导致的性能问题。 我们需要创建一个`LruCache`实例来保存图片的Bitmap对象。`LruCache`的大小可以根据应用程序可用内存的百分比进行设定,以避免过度占用内存。例如: ```java int memCacheSize = (int) (Runtime.getRuntime().maxMemory() / 1024) / 8; // 获取最大内存,除以1024转KB,再除以8转MB LruCache<String, Bitmap> memoryCache = new LruCache<>(memCacheSize); ``` 接着,我们需要实现图片的加载逻辑,包括从网络下载图片、解析图片到Bitmap并将其存入`LruCache`,以及从`LruCache`中获取图片: ```java public class ImageLoader { private LruCache<String, Bitmap> memoryCache; public void loadImage(String imageUrl, ImageView imageView) { Bitmap bitmap = getFromMemoryCache(imageUrl); if (bitmap != null) { imageView.setImageBitmap(bitmap); } else { // 图片不存在于内存缓存,从网络加载 new LoadImageTask(imageUrl, imageView).execute(); } } private Bitmap getFromMemoryCache(String key) { return memoryCache.get(key); } private void addBitmapToMemoryCache(String key, Bitmap bitmap) { if (getBitmapSize(bitmap) <= memoryCache.maxSize()) { memoryCache.put(key, bitmap); } } // 计算Bitmap的大小,用于判断是否能放入内存缓存 private int getBitmapSize(Bitmap bitmap) { return bitmap.getRowBytes() * bitmap.getHeight(); } // 使用AsyncTask异步加载图片 private class LoadImageTask extends AsyncTask<Void, Void, Bitmap> { private String imageUrl; private ImageView imageView; public LoadImageTask(String imageUrl, ImageView imageView) { this.imageUrl = imageUrl; this.imageView = imageView; } @Override protected Bitmap doInBackground(Void... voids) { // 下载图片并转换为Bitmap Bitmap bitmap = downloadAndDecodeImage(imageUrl); return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { if (bitmap != null) { addBitmapToMemoryCache(imageUrl, bitmap); imageView.setImageBitmap(bitmap); } } } } ``` 然而,内存缓存的容量有限,无法保存所有图片。此时,我们可以引入`DiskLruCache`作为二级缓存,它是一种基于磁盘的缓存,能够长期保存大量数据。`DiskLruCache`的使用相对复杂,需要处理文件的读写操作: ```java public class DiskLruCacheHelper { private static final int VALUE_COUNT = 1; private DiskLruCache diskLruCache; public DiskLruCacheHelper(Context context) throws IOException { File cacheDir = context.getCacheDir(); diskLruCache = DiskLruCache.open(cacheDir, 1, VALUE_COUNT, 100 * 1024 * 1024); // 100MB } public void put(String key, Bitmap bitmap) throws IOException { Editor editor = diskLruCache.edit(key); if (editor != null) { OutputStream out = editor.newOutputStream(0); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); out.close(); editor.commit(); } } public Bitmap get(String key) throws IOException { DiskLruCache.Snapshot snapshot = diskLruCache.get(key); if (snapshot != null) { InputStream in = snapshot.getInputStream(0); Bitmap bitmap = BitmapFactory.decodeStream(in); in.close(); return bitmap; } return null; } public void remove(String key) throws IOException { diskLruCache.remove(key); } } ``` 在`ImageLoader`中,当图片未在内存缓存中找到时,我们可以通过`DiskLruCache`尝试从磁盘获取: ```java public class ImageLoader { // ... private DiskLruCacheHelper diskLruCacheHelper; public ImageLoader(Context context) { // 初始化DiskLruCacheHelper diskLruCacheHelper = new DiskLruCacheHelper(context); } // ... private Bitmap getFromDiskCache(String key) throws IOException { return diskLruCacheHelper.get(key); } private void addBitmapToDiskCache(String key, Bitmap bitmap) throws IOException { diskLruCacheHelper.put(key, bitmap); } } ``` 这样,我们就构建了一个基于`LruCache`和`DiskLruCache`的二级缓存`ImageLoader`。当用户再次请求同一图片时,优先从内存缓存中查找,若找不到则从磁盘缓存中获取,如果磁盘缓存也不存在,则从网络加载并同时存入两级缓存。这种设计既保证了图片加载速度,又有效利用了系统资源。 在实际项目中,可能还需要考虑更多细节,比如线程安全、图片的压缩和解码策略、异常处理等。通过持续优化,我们可以打造出更加高效、稳定的图片加载框架。
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JAR.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JAR.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JAR.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JAR.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JAR.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JAR.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JAR.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JAR.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JAR.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
- 1
- 2
- 3
- 4
- 5
- 6
- 11
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 2
- 资源: 2
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 【独家首发】鹈鹕算法POA-DELM锂电池寿命SOC估计【含Matlab源码 7009期】.zip
- 【创新发文】人工蜂群算法ABC-DELM预测(多输入单输出)【含Matlab源码 6945期】.zip
- 【创新发文】人工蜂群算法ABC-DELM预测(多输入单输出)【含Matlab源码 6945期】.zip
- 【创新发文】三角测量拓扑聚合器TTAO-DELM预测(多输入单输出)【含Matlab源码 6946期】.zip
- 【创新发文】三角测量拓扑聚合器TTAO-DELM预测(多输入单输出)【含Matlab源码 6946期】.zip
- 【创新发文】蛇群算法SO-DELM预测(多输入单输出)【含Matlab源码 6948期】.zip
- 【创新发文】蛇群算法SO-DELM预测(多输入单输出)【含Matlab源码 6948期】.zip
- 【创新发文】沙猫群算法SCSO-DELM预测(多输入单输出)【含Matlab源码 6947期】.zip
- 【创新发文】沙猫群算法SCSO-DELM预测(多输入单输出)【含Matlab源码 6947期】.zip
- 【创新发文】淘金算法GRO-DELM预测(多输入单输出)【含Matlab源码 6950期】.zip
- 【创新发文】淘金算法GRO-DELM预测(多输入单输出)【含Matlab源码 6950期】.zip
- 【创新发文】鹈鹕算法POA-DELM预测(多输入单输出)【含Matlab源码 6951期】.zip
- 【创新发文】鹈鹕算法POA-DELM预测(多输入单输出)【含Matlab源码 6951期】.zip
- 【创新发文】狮群算法LSO-DELM预测(多输入单输出)【含Matlab源码 6949期】.zip
- 【创新发文】狮群算法LSO-DELM预测(多输入单输出)【含Matlab源码 6949期】.zip
- 【创新发文】秃鹰算法BES-DELM预测(多输入单输出)【含Matlab源码 6953期】.zip
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)