Android异步加载图片并缓存到内存和SD卡上

2024-03-10 17:18

本文主要是介绍Android异步加载图片并缓存到内存和SD卡上,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

* 异步加载图片* 使用方法:* private AsyncImageLoader asyImg = new AsyncImageLoader();* asyImg.LoadImage(productItems.get(position).getPic(), (ImageView)view.findViewById(R.id.pic));*/public class AsyncImageLoader {// 为了加快速度,在内存中开启缓存(主要应用于重复图片较多时,或者同一个图片要多次被访问,比如在ListView时来回滚动)public Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();private ExecutorService executorService = Executors.newFixedThreadPool(5); // 固定五个线程来执行任务private final Handler handler = new Handler();// SD卡上图片储存地址private final String path = Environment.getExternalStorageDirectory().getPath() + "/maiduo";/*** * @param imageUrl*            图像url地址* @param callback*            回调接口* @return 返回内存中缓存的图像,第一次加载返回null*/public Drawable loadDrawable(final String imageUrl,final ImageCallback callback) {// 如果缓存过就从缓存中取出数据if (imageCache.containsKey(imageUrl)) {SoftReference<Drawable> softReference = imageCache.get(imageUrl);if (softReference.get() != null) {return softReference.get();}} else if (useTheImage(imageUrl) != null) {return useTheImage(imageUrl);}// 缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中executorService.submit(new Runnable() {public void run() {try {final Drawable drawable = Drawable.createFromStream(new URL(imageUrl).openStream(), "image.png");imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));handler.post(new Runnable() {public void run() {callback.imageLoaded(drawable);}});saveFile(drawable, imageUrl);} catch (Exception e) {throw new RuntimeException(e);}}});return null;}// 从网络上取数据方法public Drawable loadImageFromUrl(String imageUrl) {try {return Drawable.createFromStream(new URL(imageUrl).openStream(),"image.png");} catch (Exception e) {throw new RuntimeException(e);}}// 对外界开放的回调接口public interface ImageCallback {// 注意 此方法是用来设置目标对象的图像资源public void imageLoaded(Drawable imageDrawable);}// 引入线程池,并引入内存缓存功能,并对外部调用封装了接口,简化调用过程public void LoadImage(final String url, final ImageView iv) {if (iv.getImageMatrix() == null) {iv.setImageResource(R.drawable.loading);}// 如果缓存过就会从缓存中取出图像,ImageCallback接口中方法也不会被执行Drawable cacheImage = loadDrawable(url,new AsyncImageLoader.ImageCallback() {// 请参见实现:如果第一次加载url时下面方法会执行public void imageLoaded(Drawable imageDrawable) {iv.setImageDrawable(imageDrawable);}});if (cacheImage != null) {iv.setImageDrawable(cacheImage);}}/*** 保存图片到SD卡上* * @param bm* @param fileName* */public void saveFile(Drawable dw, String url) {try {BitmapDrawable bd = (BitmapDrawable) dw;Bitmap bm = bd.getBitmap();// 获得文件名字final String fileNa = url.substring(url.lastIndexOf("/") + 1,url.length()).toLowerCase();File file = new File(path + "/image/" + fileNa);// 创建图片缓存文件夹boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在if (sdCardExist) {File maiduo = new File(path);File ad = new File(path + "/image");// 如果文件夹不存在if (!maiduo.exists()) {// 按照指定的路径创建文件夹maiduo.mkdir();// 如果文件夹不存在} else if (!ad.exists()) {// 按照指定的路径创建文件夹ad.mkdir();}// 检查图片是否存在if (!file.exists()) {file.createNewFile();}}BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);bos.flush();bos.close();} catch (Exception e) {// TODO: handle exception}}/*** 使用SD卡上的图片* */public Drawable useTheImage(String imageUrl) {Bitmap bmpDefaultPic = null;// 获得文件路径String imageSDCardPath = path+ "/image/"+ imageUrl.substring(imageUrl.lastIndexOf("/") + 1,imageUrl.length()).toLowerCase();File file = new File(imageSDCardPath);// 检查图片是否存在if (!file.exists()) {return null;}bmpDefaultPic = BitmapFactory.decodeFile(imageSDCardPath, null);if (bmpDefaultPic != null || bmpDefaultPic.toString().length() > 3) {Drawable drawable = new BitmapDrawable(bmpDefaultPic);return drawable;} elsereturn null;}}


这篇关于Android异步加载图片并缓存到内存和SD卡上的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/794938

相关文章

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py