http://www.cctime.com/html/2011-11-29/201111291037553094_2.htm

http://blog.csdn.net/life02/article/details/7588502

在下载文件或者在线浏览文件时,或者为了保证文件下载的正确性,需要使用缓存机制,常使用SoftReference来实现。

SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类所提供的get方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之后,get方法将返回null。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

一般的缓存策略是:

一级内存缓存、二级文件缓存(数据库也算作文件缓存)、三级网络数据

一、网络下载的缓存策略

关于网络下载文件(图片、音频、视频)的基本策略:

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)给缓存文件加密。最简单就是去掉文件的扩展名,这也算加密,当然,你可以把服务端文件加密,然后在内存中解密。这就看项目的需求而定,我的经验也不足,一般就是改改扩展名之类的。

网络图片在开发过程中,一般都将图片缓存到本地sd卡中(经常要使用的图片),方便下次直接引用而不再次请求网络耗费资源。而如果是自己开发搜索功能里有涉及到图片的显示,可以直接Map<String, SoftReference<Drawable>>,即软引用。软引用重要代码代码:package com.test.load;import java.lang.ref.SoftReference;import java.net.URL;import java.util.HashMap;import java.util.Map;import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.Message;public class ThreadImgLoader {private Map<String, SoftReference<Drawable>> imageCache=new HashMap<String, SoftReference<Drawable>>();public Drawable loadDrawable(final String imgUrl, final ImageCallback callback){if (imageCache.containsKey(imgUrl)) {SoftReference<Drawable> sf=imageCache.get(imgUrl);if (sf.get()!=null) {return sf.get();}}final Handler handler=new Handler(){public void handleMessage(Message msg) {callback.imageLoaded((Drawable) msg.obj);}};new Thread(){public void run() {Drawable drawable=loadImgFromUrl(imgUrl);if (drawable!=null) {imageCache.put(imgUrl, new SoftReference<Drawable>(drawable));Message msg=handler.obtainMessage(0, drawable);handler.sendMessage(msg);}}}.start();return null;}public Drawable loadImgFromUrl(String imgUrl) {try {return Drawable.createFromStream(new URL(imgUrl).openStream(), "src");} catch (Exception e) {return null;}}public interface ImageCallback{public void imageLoaded(Drawable drawable);}}下面是缓存到SD卡的重要代码,当然你也可以搜索一下,这方面的东西很多。WeakHashMap也是使用了软引用,你可以去看它的源代码:package com.test;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import java.util.WeakHashMap;import android.graphics.Bitmap;import android.graphics.Bitmap.CompressFormat;import android.graphics.BitmapFactory;import android.os.Environment;public class MyImgCache extends WeakHashMap<String, Bitmap> {private static MyImgCache myImgCache=new MyImgCache();private static final String CACHE_FILE="/MyXiaoCaiImg";public static MyImgCache getInstance(){return myImgCache;}public boolean isBitmapExist(String url) {boolean isexist=false;String name=changeUrlName(url);String filePath=isMakeFile();File file=new File(filePath, name);if (containsKey(url)) {isexist=true;}else if (file.exists()) {String path=file.getAbsolutePath();System.out.println(path);Bitmap bitmap=BitmapFactory.decodeFile(path);if (bitmap!=null) {put(url, bitmap, false);isexist=true;}}return isexist;}private String changeUrlName(String url) {String name = url.replaceAll(":", "_");name = name.replaceAll("//", "_");name = name.replaceAll("/", "_");name = name.replaceAll("=", "_");name = name.replaceAll(",", "_");name = name.replaceAll("&", "_");return name;}private String isMakeFile() {String rootpath = null;if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {rootpath = Environment.getExternalStorageDirectory().toString();}String filepath = rootpath + CACHE_FILE;File file = new File(filepath);if (!file.exists()) {file.mkdirs();}return filepath;}public Bitmap put(String key, Bitmap value) {String name=changeUrlName(key);String filePath=isMakeFile();File file = new File(filePath, name);OutputStream outputStream = null;try {outputStream = new FileOutputStream(file);value.compress(CompressFormat.JPEG, 100, outputStream);outputStream.flush();outputStream.close();outputStream = null;} catch (Exception e) {e.printStackTrace();}return super.put(key, value);}public Bitmap put(String key, Bitmap value, boolean b) {if (b) {return this.put(key, value);}else {return super.put(key, value);}}}

Android 利用缓存机制实现文件下载相关推荐

  1. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...

    想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...

  2. Android视频缓存机制——AndroidVideoCache

    首先简单讲下AndroidVideoCache的缓存机制-LruCache. 缓存策略主要包含缓存的添加.获取和删除这三类操作. LruCache就是利用了LinkedHashMap的访问模式 设置L ...

  3. Android客户端缓存机制(文字缓存和多媒体文件缓存)

    概述: 客户端缓存机制是Android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择. 缓存机制分为两部分,一部分是文字缓存,另一部分是多媒 ...

  4. Android 图片缓存机制

    1.采用线程池  2.内存缓存+文件缓存  3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4  4.对下载的图片进行按比例缩放,以减少内存 ...

  5. android电脑文件列表不刷新,Android 利用RecyclerView.Adapter刷新列表中的单个view问题...

    首先使用RecyclerView的adapter继承:RecyclerView.Adapter public class OrderListAdapter extends RecyclerView.A ...

  6. Android学习——ListView的缓存机制

    在使用ListView的时候,需要加载适配器和数据源,这篇文章主要介绍一下ListView的使用以及利用ListView的缓存机制来减少系统的初始化时间. ListView的使用 ListView和V ...

  7. 反思 | Android 音视频缓存机制的系统性设计

    反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 . 背景 在自媒体的时代,音视频播放 俨然已成为内容类型 APP 最基础的能力,对于 Android 开发者而言,无论是 Goo ...

  8. Android 显示刷新机制、VSYNC和三重缓存机制

    Android 显示刷新机制.VSYNC和三重缓存机制 为了理解 APP 是如何进行渲染的,我们就必须了解手机硬件是如何工作的,也必须理解什么是 VSYNC. 首先,我们需要了解2个相关概念: 刷新率 ...

  9. Android 缓存机制 LRUCache

    1.缓存策略 缓存策略主要包含缓存的添加.获取和删除三类操作.删除缓存是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的.当缓存满了之后,再想添加缓存就需要删除一些旧的缓存来添加新的缓存. L ...

最新文章

  1. Python数据可视化——使用Matplotlib创建散点图
  2. 电脑账户头像怎么删掉_电脑用户账户头像在哪里更改?怎么更改?
  3. git pull命令执行时,命令框不可操作的问题
  4. linux文件句柄满了 现象_Linux 离奇磁盘爆满,如何解决? | 原力计划
  5. objective-c宏定义
  6. Bing Maps开发扩展三:Bing Maps中渲染ESRI SHP空间数据
  7. Linux 操作命令大全
  8. matlab深度DoF图像修复,windows10系统运行dnf提示client.exe损坏的图像解决方法
  9. 学好mysql数据库能找到什么工作_MySQL数据库学习路线汇总整理全集(附详细的学习路线介绍图)...
  10. 计算机网络调试+定额,第一章-计算机网络系统设备安装工程-定额.doc
  11. office2020与2016版的不同_如何解决Office2020与office2020兼容问题
  12. MLP is Maybe Your Need
  13. 基于LSTM算法的股票预测详解
  14. win配置前端开发环境
  15. Hbase_Hbase 中 bloom filter 的设计与概念
  16. 空间数据管理问题及解决方案
  17. 使用java -jar 修改SpringBoot项目中application.properties的配置项
  18. gui实现2048小游戏
  19. Oracle:ORA-00054 资源正忙
  20. Mathmatic 函数表

热门文章

  1. micropython教程nucleo-f767zi开发板_Micropython教程之TPYBoard开发板制作电子时钟(萝卜学科编程教育)...
  2. 最长公共子串(10分)
  3. 利用函数求数组中的最大值
  4. 【Java】环境变量配置
  5. 从三级界面直接跳回一级调用方法
  6. 【必收藏】台大李宏毅老师课程 | 资源汇总、笔记总结与索引
  7. cmd mysql utf8_MySQL中UTF8编码的数据在cmd下乱码
  8. hyperledger部署java_Hyperledger Fabric(超级账本) Java 开发区块链 部署运行智能合约
  9. flyway常用配置_flyway的使用
  10. android:#FFFFFFFF 颜色码解析