移动应用开发(IOS/android等)中一个通用的图片缓存方案讲解(附流程图)

在移动应用开发中,我们经常会遇到从网络请求图片到设备上展示的场景。

如果每次都重复发起请求,浪费流量、浪费电量,用户体验也不佳;

将图片持久化到磁盘也不失为一种策略;但每次从文件读取图片也存在一定的io开销,就算采用此策略,我们也需要控制磁盘缓存的容量,以免占用过多系统资源。

其实没有一个方案可以说是完美的方案,只有最适合自己业务需求的方案,才可以说是一个好方案。

我们下面所讲解的方案具备很强的通用性,设计思路简单而清晰:

1.假设每个网络图片的url具有唯一性,如果网络上的图片变化了,会引起输入源的url变化;

2.基于1,我们将url作为图片缓存的唯一标识(可以做hash,做md5,也可以用urlstring作为key,都是可以的)

3.访问优先级:内存缓存>磁盘缓存>网络资源

以上3点就是我们这个方案的基本策略,以下是技术细节:

1.对于缓存的管理,我们可以设置阀值(包括缓存存在时间和缓存容量),达到条件触发清理;还可以结合LRU(Least Recently Used 近期最少使用算法)算法来提升缓存访问效率,这需要在写缓存时对缓存的使用次数进行相应标记,此处对此算法不展开,有兴趣的自行google.

2.对于网络资源的加载我们必须采用异步的方案,如此做才不会阻塞ui的展示;可以将请求加到队列中支持并发请求,需要注意的是我们可以根据某个地址可以支持同时连接的url数量来设置最大并发请求数目,来提高效率。

3.在访问磁盘缓存/网络资源成功时,需要填充高优先级的缓存,当磁盘缓存访问成功时,填充内存缓存;当网络资源访问成功时,填充内存缓存+磁盘缓存。


对于具体的使用场合我们可以根据业务需要来决定是否采纳或部分采纳此方案,也可以对此方案中的一些策略根据项目需要进行修改(比如何时不访问磁盘缓存、何时清空缓存、何时强制刷新缓存等),来满足业务需求。

时间: 2024-12-24 16:17:22

移动应用开发(IOS/android等)中一个通用的图片缓存方案讲解(附流程图)的相关文章

android上的一个网络接口和图片缓存框架enif简析_Android

1.底层网络接口采用apache的httpclient连接池框架: 2.图片缓存采用基于LRU的算法: 3.网络接口采用监听者模式: 4.包含图片的OOM处理(及时回收处理技术的应用): 图片核心处理类:CacheView.java 复制代码 代码如下: package xiaogang.enif.image; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; imp

android上的一个网络接口和图片缓存框架enif简析

1.底层网络接口采用apache的httpclient连接池框架: 2.图片缓存采用基于LRU的算法: 3.网络接口采用监听者模式: 4.包含图片的OOM处理(及时回收处理技术的应用): 图片核心处理类:CacheView.java 复制代码 代码如下: package xiaogang.enif.image; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; imp

安卓开发-android项目中一个Activity一般配一个xml文件,什么情况下配多个xml文件呢

问题描述 android项目中一个Activity一般配一个xml文件,什么情况下配多个xml文件呢 android项目中一个Activity一般配一个xml文件,什么情况下配多个xml文件呢 有没有Activity不需要xml文件的情况呢 解决方案 多个xml一般是需要适配不同大小的屏幕,安卓会根据屏幕大小自动加载不同size的屏幕的xml,安卓开发是mvc结构,activity一定需要一个view,通常是需要xml做view,但是也可以自定义一个view然后activity加载这个view

Swift开发iOS应用过程中的问题和解决记录

Swift开发iOS应用过程中的问题和解决记录 虚拟机里安装OSX+XCode开发环境 用真机的请直接跳过这个部分. 主要是在VitrualBox里安装mac系统和xcode,参考这篇教程,VirtualBox的版本是4.3.18 r96156,OSX版本是10.11 El Capitan,XCode版本是7.1 (7B91b). 经过几天的初步使用,感觉用虚拟机开发iOS基本能够满足要求,i5/8g/ssd的配置目测能达到真机70%的开发效率.主要存在的问题是:1)在宽屏上无法满屏,两边会留有

Xamarin体验:使用C#开发iOS/Android应用

原文:Xamarin体验:使用C#开发iOS/Android应用 Xamarin是Mono创始人Miguel de Icaza创建的公司,旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发.   简介 Xamarin是基于Mono的平台,目前主要有以下产品(更具体请见:http://xamarin.com/products): Xamarin Studio:IDE,是从原来的MonoDevelop改名而来.现在从MonoDevelop官方网站下载的其实也是

Android编程中聊天页面背景图片、标题栏由于键盘引起问题的解决方法_Android

本文实例讲述了Android编程中聊天页面背景图片.标题栏由于键盘引起问题的解决方法.分享给大家供大家参考,具体如下: 在一个群里面有人问到 聊天页面由于键盘弹出来,导致自定义的标题栏不见和背景图片都变形了,然后自己也折腾了一下,在stackOverFlow上面找到了一个解决方法. 解决方法很简单: 1.在AndroidManifest.xml文件里面的Activity配置: 复制代码 代码如下: android:windowSoftInputMode="adjustResize|stateAl

Android开发之在程序中时时获取logcat日志信息的方法(附demo源码下载)_Android

本文实例讲述了Android开发之在程序中时时获取logcat日志信息的方法.分享给大家供大家参考,具体如下: 今天分享一个在软件开发中很实用的例子,也是这几天在通宵加班中我使用的一个小例子, 在程序中监听Log信息. 为什么说它实用?原因是Android的开发厂商各种修改之后手机和手机之间以后存在很多差异.比如说魅族M9手机 开发中如果项目中涉及到访问手机系统的地方,例如访问系统短信库,M9手机它会提示一个dialog框 让用户自己去选择 访问还是不访问.这样就给开发适配带来了巨大的麻烦.本来

android开发-在android应用中,添加评论,或者话题讨论功能

问题描述 在android应用中,添加评论,或者话题讨论功能 我想在应用中添加评论,话题讨论这种功能,像美团,大众点评这样的评论功能,求思路求各位老师指点,或者提供点参考资料 解决方案 思路就是:把每条评论(包括评论人.被评论人或被评论的商品.评论内容.评论时间等)加上标识,并加载到协议(其实就是一句带参数的字符串)中,发送给服务器.当别人拿数据或者你刷新数据时,再从服务器根据标识取下来你发的.或者发给你的数据,这样就形成了一个评论功能. 如果想自己弄的话,android你需要了解Jason格式

android开发-在android程序中在acitvity继承的重载函数外定义的语句

问题描述 在android程序中在acitvity继承的重载函数外定义的语句 请问如果在非重载函数外定义的函数,在哪个函数之后被执行? 比如在一个activity里有onCreate, onstart函数,如果在这些函数外面声明了函数或者语句,会在什么时候执行? 我会上机试一试.来验证你们的答案~~谢谢哈 解决方案 你不调用它怎么执行啊.... 还有好像语句必须在方法里面...