DiskLrucCache使用的Demo,这个demo是从网络获取一张图片,保存到本地缓存中(sdcard和内存),当下载成功后。再打开不会又一次向网络请求图片。而是世界使用本地资源。

要使用DiskLrucCache须要先下载此类.   下载地址点这里

主类:

/**
* DiskLrucCache使用Demo
*
* @author pangzf
* @date 2014年8月12日 下午2:13:26
*/
public class DemoActivity extends Activity { private DiskLruCache mDiskLrucache;
private ImageView mIvShow;
private String mBitMapUrl;
private String mKey;
private ProgressDialog mPd;
private Handler mHandler = new Handler() { @Override
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
// 10.下载图片之后展示
boolean isSuccess = (boolean) msg.obj;
if (isSuccess) {
Snapshot snapshot;
try {
snapshot = mDiskLrucache.get(mKey);
InputStream is = snapshot.getInputStream(0);
mIvShow.setImageBitmap(BitmapFactory.decodeStream(is));
} catch (IOException e) {
e.printStackTrace();
} }
if (mPd != null && mPd.isShowing()) {
mPd.dismiss();
}
} }; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
mIvShow = (ImageView) findViewById(R.id.iv_show);
mPd = new ProgressDialog(DemoActivity.this);
try {
// 1.存放缓存的文件夹
File directory = DiskLrucacheUtils.getDiskCache(DemoActivity.this,
"bitmap");
// 2.版本
int appVersion = DiskLrucacheUtils.getAppVersion(DemoActivity.this);
int valueCount = 1;
// 3.缓存的最大值,这里设置10m
long maxSize = 10 * 1024 * 1024;
// 4.打开disklrucache
mDiskLrucache = DiskLruCache.open(directory, appVersion,
valueCount, maxSize);
mBitMapUrl = "https://raw.githubusercontent.com/pangzaifei/LineChartView/master/LineChartView/effice_picture/a.jpg";
if (mDiskLrucache != null) {
// 5.假设在缓存中存在就用缓存中的bitmap,假设不存在上网上下载
mKey = DiskLrucacheUtils.getKey(mBitMapUrl);
Snapshot snapshot = mDiskLrucache.get(mKey);
if (snapshot != null) {
InputStream is = snapshot.getInputStream(0);
Bitmap bitmap = BitmapFactory.decodeStream(is);
if (bitmap != null) {
mIvShow.setImageBitmap(bitmap);
}
} else {
mPd.show();
new Thread() {
public void run() {
// 6.下载图片
mPd.setMessage("正在载入数据....");
userDiskLrucache();
};
}.start();
}
} } catch (Exception e) {
e.printStackTrace();
} } private void userDiskLrucache() {
try { String bitMapUrl = "https://raw.githubusercontent.com/pangzaifei/LineChartView/master/LineChartView/effice_picture/a.jpg";
String key = DiskLrucacheUtils.getKey(bitMapUrl);
Editor edit = mDiskLrucache.edit(key);
// 7.从server下载图片
boolean isSuccess = DiskLrucacheUtils.downloadBitmap(bitMapUrl,
edit.newOutputStream(0));
if (isSuccess) {
// 8.提交到缓存
edit.commit();
// 9.下载成功去展示图片
Message msg = mHandler.obtainMessage();
msg.obj = true;
mHandler.sendMessage(msg);
} else {
edit.abort();
} } catch (Exception e) {
e.printStackTrace();
}
} @Override
protected void onPause() {
try {
if (mDiskLrucache != null) {
mDiskLrucache.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.onPause();
} @Override
protected void onDestroy() {
try {
if (mDiskLrucache != null) { mDiskLrucache.close();
}
} catch (IOException e) {
e.printStackTrace();
}
super.onDestroy();
}
}

使用DiskLrucache自己写的工具类.

package com.pangzaifei.disklrucachedemo.libcore;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Environment; /**
* diskLrucache的工具类
*
* @author pangzf
* @date 2014年8月12日 上午10:58:50
*/
public class DiskLrucacheUtils {
/**
* 获得缓存文件夹,当sdcard存在的时候使用,sdcard图片缓存。假设sdcard不存在使用data/data下的图片缓存
*
* @param context
* @param uniqueName
* @return
*/
public static File getDiskCache(Context context, String uniqueName) {
String path;
if (Environment.getExternalStorageDirectory().equals(
Environment.MEDIA_MOUNTED)) {
// 存在sdcard
path = Environment.getExternalStorageDirectory().getPath();
} else {
// 不存在sdcard使用手机内存
path = context.getCacheDir().getPath();
}
return new File(path + File.separator + uniqueName);
} /**
* 获得app版本
*
* @param context
* @return
* @throws NameNotFoundException
*/
public static int getAppVersion(Context context)
throws NameNotFoundException {
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0);
return packageInfo.versionCode; } /**
* 将图片url进行md5加密生成一个字符串,由于有的url地址里面存在特殊字符
*
* @param urlStr
* @return
* @throws NoSuchAlgorithmException
*/
public static String getKey(String urlStr) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("md5");
messageDigest.update(urlStr.getBytes());
return bytesToString(messageDigest.digest());
} /**
* byte转string
*
* @param bytes
*/
private static String bytesToString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(0xFF & bytes[i]);
if (hex.length() == 1) {
sb.append(0);
}
sb.append(hex);
}
return sb.toString();
} /**
* 下载图片到cache
*
* @param imageString
* @param ops
* @return
*/
public static boolean downloadBitmap(String imageString, OutputStream ops) {
URL url;
HttpURLConnection conn = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
url = new URL(imageString);
conn = (HttpURLConnection) url.openConnection(); bis = new BufferedInputStream(conn.getInputStream());
bos = new BufferedOutputStream(ops); int b;
while ((b = bis.read()) != -1) {
bos.write(b);
}
return true;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.disconnect();
}
if (bos != null) {
bos.close();
}
if (bis != null) {
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return false; }
}

源代码下载地址

感谢guolin的博客对我的帮助。

DiskLrucCache使用Demo(强烈推荐,非常好用)的更多相关文章

  1. 微信小程序源码推荐

    wx-gesture-lock  微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...

  2. TextView+Fragment实现底部导航栏

    前言:项目第二版刚上线没多久,产品又对需求进行了大改动,以前用的是左滑菜单,现在又要换成底部导航栏,于是今天又苦逼加班了.花了几个小时实现了一个底部导航栏的demo,然后总结一下.写一篇博客.供自己以 ...

  3. 微信小程序 教程及示例

    作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有,转载请联系作者获得授权.微信小程序正式公测, ...

  4. 用rem来做响应式开发

    强烈推荐这篇文章:<web app 变革之rem> px转rem工具:<px转rem工具> 由于最近在做公司移动项目的重构,因为要实现响应式的开发,所以大量使用到了rem的单位 ...

  5. 百度编辑器ueditor 使用

    ueditor 百度开源的一个 编辑器 ,支持api.扩展,demo丰富.推荐下 以前写 编辑 词典的使用 jquery-te  轻量级编辑器..当时看中了 它代码轻巧.容易改. 把他的功能改了好多. ...

  6. css @media认识

    css2的@media css2里面尽管支持@media属性.可是能实现的功能比較少,一般仅仅用做打印的时候做特殊定义的CSS. 语法: @media sMedia { sRules } 说明: sM ...

  7. 分享收集的WebGL 3D学习资源

    大家好,我在本文中分享了我收集的WebGL 3D相关的博客.书籍.教程.demo等内容,希望对大家学习WebGL和3D有所帮助,谢谢- 相关博客 Wonder技术 Wonder是我们的产品,包含Web ...

  8. 【java提高】---java反射机制

    java反射机制 一.概述 1.什么是反射机制 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态 ...

  9. 微信小程序案例大全

    微信小程序demo:足球,赛事分析 小程序简易导航 小程序demo:办公审批 小程序Demo:电魔方 小程序demo:借阅伴侣 微信小程序demo:投票 微信小程序demo:健康生活 小程序demo: ...

随机推荐

  1. kubernetes HA 脚本

    集群方案: 发行版:CentOS 7 版本: Kubernetes:1.9.1 master高可用方案:keepalived LVS 网络方案:Flannel Master HA 四步骤: 1. 安装 ...

  2. Phpstorm-php在线手册配置

    php在线手册配置 第一个是浏览器软件位置 第二个是php网站写法 第三个是工作路径 C:\Users\hasee\AppData\Local\Google\Chrome\Application\ch ...

  3. WPF的UI虚拟化

    许多时候,我们的界面上会呈现大量的数据,如包含数千条记录的表格或包含数百张照片的相册.由于呈现UI是一件开销比较大的动作,一次性呈现数百张照片就目前的电脑性能来说是需要占用大量内存和时间的.因此需要对 ...

  4. HDU 4638 Group (2013多校4 1007 离线处理+树状数组)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. FIREDAC用于LINUX报头文件FireDAC.VCLUI.Wait找不到

    FIREDAC用于LINUX报头文件FireDAC.VCLUI.Wait找不到 FIREDAC LINUX下面,此控件 此属性 必须设为CONSOLE.  默认值只能用于WINDOWS操作系统.

  6. 【POI】解析xls报错:java.util.zip.ZipException: error in opening zip file

    今天使用POI解析XLS,报错如下: Servlet.service() for servlet [rest] in context with path [/cetBrand] threw excep ...

  7. IOS APP 上传到AppStore

    由于第一次接触要把 app 上传到 AppStore 比较棘手,很多地方不懂,研究了 大半天 终于给上传成功了,现在坐等审核吧,首先把上传到AppStore的流程 整理下 : 第一 :准备证书 (要确 ...

  8. conkey conf

    update_interval 1.0 # 更新时间间隔double_buffer yes # 双缓存,解决Conky闪烁问题use_xft yes # 自定义字体xftfont DejaVu San ...

  9. vue - 选项

    1.计算属性(computed):主要是对原数据进行改造输出.改造输出:包括格式化数据(价格,日期),大小写转换,排序,添加符号 2.methods(methods):用于绑定html中的事件对应的方 ...

  10. Java创建和读取Json

    在Java中构造和解析JSON我用的是org.json,附件为相应的org.json.jar. 下面是两个函数,一个是创建JSON,一个是从文本构造JSON并解析之. 创建json: //constr ...