当前位置: 首页 > news >正文

Android 开发中的网络下载策略 与 文件缓存策略

一般的缓存策略是:
一级内存缓存、二级文件缓存(数据库也算作文件缓存)、三级网络数据

一、网络下载的缓存策略
关于网络下载文件(图片、音频、视频)的基本策略:
1.不要直接下载到目标文件,应使用temp文件作中转,以确保文件的正确性与完整性,流程如下:
a)以网络目标文件名 A 生成唯一的本地目标文件名 B
b)以本地目标文件名 B 生成唯一的本地临时文件名 T
c)下载文件到 T 中
d)下载完毕,校验文件 T 的正确性与完整性
e)若不正确或不完整则 delete 文件 T,并返回 false
f)校验完毕后,将文件 T 重命名 或 复制到 B 文件
g)最后的清理现场,删除临时文件 T,成功后,返回 true
2.尽力提供文件正确性与完整性的校验:
a)正确性:比如 MD5/Hash Code 比对、文件格式的比对。
b)完整性:比如 文件大小是否一致、图片的数据是否正确(图片文件头中提供了相关信息)
3.考虑对于下载到本地的文件是否需要再做二次加工,可以思考以下情况:
a)比如网络源始图片的大小为800*600,而我们需要作为缩略图的大小为160*145,所以考虑对下载后的文件进行裁剪,再保存,对于源始文件则直接删除。

二、文件缓存策略:
1.需要唯一的缓存文件的对应I/O key,一般可以使用 hashcode。
2.若是同一个文件,以不同的时间,可以考虑,先清本地缓存,再下载新的缓存到本地。
3.同一文件也可以加上时间戳后,再生成唯一hashcode。
4.生成文件缓时,也许需要作以下全面的考虑:

a)sdcard是否已经没有空间(这个需求是存在的,但几乎没有人会考虑到,一旦发生,必crash)。
b)缓存的清理策略。每日、每周定时清理?到达一个阀值后,自动清理?(若无清理策略,把垃圾数据一直当个宝一相存着,是很SB的)。
c)缓存真正需要的数据。不要觉外存是无限的,所以就可以什么都存,要知道,多则繁,繁则乱。曾经有一同事,每天存几百MB的用户数据(所有用户的性别、age、联系方式等等),而PM需要的只是一个每日数户的活跃数据报表,于是最后改为缓存每天的用户分析报表数据即可(才10几KB)。
d)给缓存文件加密。最简单就是去掉文件的扩展名,这也算加密,当然,你可以把服务端文件加密,然后在内存中解密。这就看项目的需求而定,我的经验也不足,一般就是改改扩展名之类的。

三、内存缓存策略
内存缓存策略是为了应对更加高效的缓存,对于不是频烦更新的文件数据,就可以缓存在内存中,但是有以下注意事项:

a)内存的I/O,弱引用。弱引用可以让JVM更加合理、自主的回收。
b)内存缓存的 key 也必须唯一,可以参考文件缓存 key 策略。
c)提供一个内存缓存刷新的接口。虽然内存缓存本身的生命周期就较短,但它必竟是最上层的用户数据,所以设计时提供一个UI刷新接口,是可以考虑的。

from:http://lichsword.net/blog/archives/542

相关文章:

  • 关于代码重构的一些思考
  • Android使用VideoView播放网络视频
  • [Android 数据通信] android cmwap接入点
  • 转: 新浪微博布局学习——妙用TabHost
  • 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab, Spinner, Chrono
  • android webview拦截超链接
  • android应用中插入flash
  • Android开发_WebView组件使用详解_LoadUrl直接显示网页内容
  • android开发我的新浪微博客户端-用户授权页面功能篇(3.2)
  • Android 调用平台功能 - 启动浏览器 支持file://
  • Android学习笔记之mainfest文件中android属性
  • android有效的内存使用
  • Android使用AsyncTask下载图片,最好使用WeakReference
  • Android笔记 SQLite总结 ,字带数据库,附记事本,字典小程序
  • android 自带的主题theme
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • Babel配置的不完全指南
  • Go 语言编译器的 //go: 详解
  • hadoop集群管理系统搭建规划说明
  • JavaScript创建对象的四种方式
  • js 实现textarea输入字数提示
  • mysql常用命令汇总
  • nfs客户端进程变D,延伸linux的lock
  • node 版本过低
  • Python socket服务器端、客户端传送信息
  • Vue.js-Day01
  • 分类模型——Logistics Regression
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 开源SQL-on-Hadoop系统一览
  • 利用DataURL技术在网页上显示图片
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 排序(1):冒泡排序
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 网页视频流m3u8/ts视频下载
  • 我从编程教室毕业
  • 小程序button引导用户授权
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (pojstep1.3.1)1017(构造法模拟)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (四)图像的%2线性拉伸
  • (原創) 未来三学期想要修的课 (日記)
  • (转)memcache、redis缓存
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)程序员疫苗:代码注入
  • (转)甲方乙方——赵民谈找工作
  • ******IT公司面试题汇总+优秀技术博客汇总
  • . NET自动找可写目录
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Micro Framework初体验(二)
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net经典笔试题