DiskLrucCache使用Demo(强烈推荐,非常好用)
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(强烈推荐,非常好用)的更多相关文章
- 微信小程序源码推荐
wx-gesture-lock 微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...
- TextView+Fragment实现底部导航栏
前言:项目第二版刚上线没多久,产品又对需求进行了大改动,以前用的是左滑菜单,现在又要换成底部导航栏,于是今天又苦逼加班了.花了几个小时实现了一个底部导航栏的demo,然后总结一下.写一篇博客.供自己以 ...
- 微信小程序 教程及示例
作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有,转载请联系作者获得授权.微信小程序正式公测, ...
- 用rem来做响应式开发
强烈推荐这篇文章:<web app 变革之rem> px转rem工具:<px转rem工具> 由于最近在做公司移动项目的重构,因为要实现响应式的开发,所以大量使用到了rem的单位 ...
- 百度编辑器ueditor 使用
ueditor 百度开源的一个 编辑器 ,支持api.扩展,demo丰富.推荐下 以前写 编辑 词典的使用 jquery-te 轻量级编辑器..当时看中了 它代码轻巧.容易改. 把他的功能改了好多. ...
- css @media认识
css2的@media css2里面尽管支持@media属性.可是能实现的功能比較少,一般仅仅用做打印的时候做特殊定义的CSS. 语法: @media sMedia { sRules } 说明: sM ...
- 分享收集的WebGL 3D学习资源
大家好,我在本文中分享了我收集的WebGL 3D相关的博客.书籍.教程.demo等内容,希望对大家学习WebGL和3D有所帮助,谢谢- 相关博客 Wonder技术 Wonder是我们的产品,包含Web ...
- 【java提高】---java反射机制
java反射机制 一.概述 1.什么是反射机制 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态 ...
- 微信小程序案例大全
微信小程序demo:足球,赛事分析 小程序简易导航 小程序demo:办公审批 小程序Demo:电魔方 小程序demo:借阅伴侣 微信小程序demo:投票 微信小程序demo:健康生活 小程序demo: ...
随机推荐
- rocketmq,zookeeper,redis分别持久化的方式
1.rocketmq持久化: RocketMQ 的所有消息都是持久化的, 先写入系统 PAGECACHE, 然后刷盘, 可以保证内存与磁盘都有一份数据,访问时,直接从内存读取. RocketMQ 的所 ...
- SecureCRT connecting VM Linux show error message: The remote system refused the connection.
SecureCRT connecting VM Linux show error message: The remote system refused the connection.
- 如何解决sqlmapapi重启后,任务全部丢失的问题
sqlmapapi的server每次启动时都会创建一个新的数据库,这样之前的扫描记录都会全部丢失 使用python sqlmapapi.py -s可以看大IPC database的位置,这个各个操作系 ...
- 二十四种设计模式:模板方法模式(Template Method Pattern)
模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...
- 3D游戏图形技术解析(7)——视差映射贴图(Parallax Mapping)【转】
http://www.cnblogs.com/taotaobujue/articles/2781371.html 视差映射贴图(Parallax Mapping) ● 传统纹理贴图的弊端 纹理贴图大家 ...
- Add Two Numbers(from leetcode python 链表)
给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...
- python 如何调用子文件下的模块
在python开发中,经常会出现调用子文件夹下的py模块 如上图,如果在test.py文件中,要调用meeting文件夹下面的huodongshu.py 模块, 直接在test.py 中 import ...
- Maven+SpringMVC+Mybatis整合入门Demo
1 数据库准备 (1)建立一个名为mytest的数据库 (2)创建表 CREATE TABLE `t_user` ( `USER_ID` int(11) NOT NULL AUTO_INCREMENT ...
- jquery中动画特效方法
基本特效 方法: 说明 .show() 显示选中的元素 .hide() 隐藏选中的元素 .toggle() ...
- Unity3D实现3D立体游戏原理及过程,需偏振眼镜3D显
http://tieba.baidu.com/p/3038509618?fr=ala0&pstaala=3