优化Android图片加载:异步+内存硬盘缓存实战
172 浏览量
更新于2024-08-30
收藏 80KB PDF 举报
在Android开发中,图片缓存与异步加载是一项关键任务,尤其是在处理包含大量图片的应用时,以避免常见的内存溢出问题(OOM)。传统的解决方案如软引用和手动管理Bitmap的生命周期往往效果不佳,特别是在Android 3.0及以上版本,软引用机制不再像以前那样有效,因为虚拟机会立即回收软引用,无法带来明显的性能提升。
ImageManager2是一个自定义的类,它提供了强大的图片处理功能,包括异步下载网络图片、从SD卡读取本地图片,以及对图片进行内存和硬盘缓存。内存缓存部分主要依赖于LruCache,这是一种高效的最近最少使用(Least Recently Used)算法实现的缓存,能够自动淘汰最久未使用的图片,从而减少内存占用。对于长期不访问但占用空间较大的图片,ImageManager2还使用了DiskLruCache来存储,这种基于文件的缓存机制,能够在设备的磁盘上提供持久化存储,确保即使在应用退出或内存不足时,图片数据不会丢失。
异步加载是通过HandlerThread来实现的,这样可以在后台线程下载图片,避免阻塞主线程,提高用户体验。当用户请求图片时,ImageManager2首先检查内存和硬盘缓存中是否存在,如果找到则直接返回;否则,它会在后台线程中发起HTTP请求下载图片,同时更新UI以显示加载动画,直到图片加载完成。
以下是部分关键代码片段:
```java
// 异步加载图片
private class ImageLoaderTask extends AsyncTask<String, Void, Bitmap> {
private String imageUrl;
@Override
protected Bitmap doInBackground(String... urls) {
imageUrl = urls[0];
Bitmap bitmap = loadFromCacheOrDisk(imageUrl);
if (bitmap != null) {
return bitmap;
}
// 如果内存和硬盘缓存都没有,开始网络请求
bitmap = downloadAndCacheImage(imageUrl);
return bitmap;
}
// 从内存或硬盘缓存中加载图片
private Bitmap loadFromCacheOrDisk(String imageUrl) {
Bitmap bitmap = memoryCache.get(imageUrl);
if (bitmap == null) {
bitmap = diskCache.get(imageUrl);
}
return bitmap;
}
// 下载图片并将其添加到缓存
private Bitmap downloadAndCacheImage(String imageUrl) {
// 使用HttpGet请求图片
HttpGet httpGet = new HttpGet(imageUrl);
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
try {
bitmap = BitmapFactory.decodeStream(entity.getContent());
// 存储到内存和硬盘缓存
memoryCache.put(imageUrl, bitmap);
diskCache.put(imageUrl, bitmap);
return bitmap;
} finally {
EntityUtils.consume(entity);
}
}
}
// 内存缓存使用LruCache
private LruCache<String, Bitmap> memoryCache = new LruCache<>(1000); // 假设1MB的缓存大小
// 硬盘缓存使用DiskLruCache
private DiskLruCache diskCache = DiskLruCache.open(context.getCacheDir(), 1, 1, 10 * 1024 * 1024); // 假设10MB的缓存大小
```
总结,ImageManager2通过合理的缓存策略、异步加载机制和内存/硬盘的分工,有效地解决了Android应用中的图片加载和内存管理问题,确保了即使在处理大量图片时也能保持良好的性能和用户体验。在实际开发中,这样的设计是值得借鉴和学习的。
2021-09-11 上传
2011-05-03 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
2020-09-01 上传
2023-03-03 上传
2021-01-06 上传
2021-01-05 上传
weixin_38657290
- 粉丝: 5
- 资源: 943
最新资源
- 深入浅出:自定义 Grunt 任务的实践指南
- 网络物理突变工具的多点路径规划实现与分析
- multifeed: 实现多作者间的超核心共享与同步技术
- C++商品交易系统实习项目详细要求
- macOS系统Python模块whl包安装教程
- 掌握fullstackJS:构建React框架与快速开发应用
- React-Purify: 实现React组件纯净方法的工具介绍
- deck.js:构建现代HTML演示的JavaScript库
- nunn:现代C++17实现的机器学习库开源项目
- Python安装包 Acquisition-4.12-cp35-cp35m-win_amd64.whl.zip 使用说明
- Amaranthus-tuberculatus基因组分析脚本集
- Ubuntu 12.04下Realtek RTL8821AE驱动的向后移植指南
- 掌握Jest环境下的最新jsdom功能
- CAGI Toolkit:开源Asterisk PBX的AGI应用开发
- MyDropDemo: 体验QGraphicsView的拖放功能
- 远程FPGA平台上的Quartus II17.1 LCD色块闪烁现象解析