移动应用开发(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.在访问磁盘缓存/网络资源成功时,需要填充高优先级的缓存,当磁盘缓存访问成功时,填充内存缓存;当网络资源访问成功时,填充内存缓存+磁盘缓存。

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

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

时间: 2024-10-10 18:23:40

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

unity3d开发的android应用中增加AD系统的详细步骤

unity3d开发的android应用中增加AD系统的详细步骤 博客分类: Unity3d unity3d Unity3d已经支持android,怎样在程序里增加admob? 试了一下,确实能够,只是必需要把androidproject的包名改成unitypackage里的包名. 决定自己也做一个unity3d的Plugins,记录一下步骤: 经过自己測试wozik提供的Plugins中的AndroidManifest.xml.res,libs.bin是必须的,其它东西都能够去掉. 依照这个思路

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设计中的.9.png图片

.9.png是一种能够自己定义拉伸特定区域的图片格式. 简书:Android设计中的.9.png图片 在Android的UI设计开发中,非常多控件须要适配不同的手机分辨率进行拉伸或者压缩,这样就出现了能够随意调整大小的一种图片格式".9.png".这样的图片是用于Android开发的一种特殊的图片格式,它能够指定特定的区域进行拉伸而不失真.同一时候能够指定前景内容的显示区域.即.9.png图片的用处能够概括为以下两点: - .9.png图片在图片拉伸的时候特定的区域不会发生图片失真.

iOS选取相册中iCloud云上图片和视频的处理

关于iOS选取相册中iCloud云上图片和视频 推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因,需要处理接入一个视频模块,在视频选择的时候遇到了一个不太容易发现的bug,产生的原因是由于手机内存小,而用户又打开了相册同步iCloud, 加载中的图片 在这时,如果本地可用内存过小,会导致将本地相册中的图片或视频删除只留缩略图,如果App调用的时候想要选取这种图片就需要从iCloud云中进行下载,才

[掌眼]iOS / Android / java / node.js 通用的 AES256 加解密算法

example.m NSString *text = @"text"; NSString *key32 = @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding]; NSString *encryptedData = [[data AES256EncryptWithKey:key32] base64EncodedStringWi

Android开发错误——Android Studio中遇到过的错误问题与解决方案汇总

(1)编译时发生 解决方法: 1.在最外层的Gradle中,删除如下的语句 (2)编译时发生 解决方法: 1.在最外层的Gradle中,删除如下的语句 (3)编译时发生 解决方法: 1.你的项目中存在中文命名,将项目中对应的中文命名改为英文即可 (4)编译时发生 解决方法: 1.你的项目中res\drawable下存在大写字母,将项目中对应的大写字母改为小写字母即可 (5)在Aidl文件进行编译时发生 解决方法: 1.项目的编译版本和编译工具的版本不一致,右键项目 open Moudle Set

(十)android项目中,通用布局的对话框的实现。

在工作中,我们的APP项目中经常需要用到dialog,一般设计师对于一个APP项目,会设计使用同一个风格,显示不同内容的对话框,所以为了提高开发的效率,我们可以针对一个项目设计一个通用的对话框,所有用到的地方都可以调用.本文针对下面效果的对话框,实现了一个通用对话框,具体实现核心代码如下所示. 1 CustomDialog.java代码实现如下所示: import android.app.ActionBar.LayoutParams; import android.app.Dialog; imp

android 上的一个网络接口和图片框架

1:网络的底层环境 采用apache 的httpClient 链接池框架 2:图片缓存采用基于LRU 的算法 3:网络接口采用监听者模式 4 包含图片的OOM 处理(及时回收处理技术的应用) package xiaogang.enif.image; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference;

Facebook推出强大Android图片库Fresco 自动释放内存 图片缓存 内存益处

自动释放内存!Facebook推出强大Android图片库Fresco 快速而又高效的显示图片对Android设备来说是件极其重要的事情,但在过去的几年里,在有效存储图像方面我们面临了很多问题.图片太大,而手机又只有很小的内存,特别是Android设备还要将内存分割给各个应用.所以,太多的图片总会耗去大部分的内存,从而导致应用的崩溃. 为了解决这一问题,Facebook最近推出了一款用于Android应用中展示图片的强大图片库Fresco,它能够从网络.本地存储和本地资源中加载图片.而且,为了节