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. Eclipse环境安装rust

    参考 https://rustdt.github.io/ https://github.com/RustDT/RustDT/blob/latest/documentation/UserGuide.md ...

  2. __dopostback的用法

    转载:http://blog.csdn.net/fwj380891124/article/details/8819926 在.NET中,所有的服务器控件提交到服务器的时候,都会调用__doPostBa ...

  3. css/js(工作中遇到的问题)-6

    页面resize方法 if(document.createEvent) { const event = document.createEvent ("HTMLEvents"); e ...

  4. OpenCV支持向量机SVM对线性不可分数据的处理

    支持向量机对线性不可分数据的处理 目标 本文档尝试解答如下问题: 在训练数据线性不可分时,如何定义此情形下支持向量机的最优化问题. 如何设置 CvSVMParams 中的参数来解决此类问题. 动机 为 ...

  5. Kafka的架构设计(目前翻译最好的一稿)

    转自:http://www.oschina.net/translate/kafka-design 参与翻译(4人):fbm, 飞翔的猴子, Khiyuan, nesteaa 感谢这些同志们的辛勤工作, ...

  6. zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法

    一.zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法 1.编译安装zabbix-server出现 编译时加参数:- ...

  7. PowerShell中的一个switch的例子

    在这个例子中, 应该注意 Switch语句里对数字范围条件的使用 break的使用 字符串的拼接 数组的声明   ) foreach ($element in $array) { switch($el ...

  8. 如何在 CentOS 7 上安装 Percona Server

    在这篇文章中我们将了解关于 Percona 服务器,一个开源的MySQL,MariaDB的替代品.InnoDB的数据库引擎使得Percona 服务器非常有吸引力,如果你需要的高性能,高可靠性和高性价比 ...

  9. 对Class.getResourceAsStream和ClassLoader.getResourceAsStream方法所使用的资源路径的解释

    这是个非常基础的问题了,这里提供一些演示样例,帮助高速理解和记忆这个问题. 在该方法的文档:http://docs.oracle.com/javase/7/docs/api/java/lang/Cla ...

  10. POJ 3122-Pie(二分+精度)

    题目地址:id=3122">POJ 3122 题意:给出n个pie的直径.有F+1个人,假设给每人分的大小同样(形状能够不同),每一个人能够分多少.要求是分出来的每一份必须出自同一个p ...