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: ...
随机推荐
- WPF中的动画——(四)缓动函数
缓动函数可以通过一系列公式模拟一些物理效果,如实地弹跳或其行为如同在弹簧上一样.它们一般应用在From/To/By动画上,可以使得其动画更加平滑. var widthAnimation = new D ...
- minGW cygwin gnuwin32
首先,三个的官方网站分别是: minGW:http://www.mingw.org cygwin: http://www.cygwin.com gnuwin32: https://sourcefo ...
- ERDAS遥感图像配准、及其它一些基本处理
内容中包含 base64string 图片造成字符过多,拒绝显示
- jQuery:validate设置样式
jquery.validate.js插件里面的样式设置: ... errorClass: "error",validClass: "valid", ... &l ...
- 四种有能力取代Cookies的客户端Web存储方案
目前在用户的网络浏览器中保存大量数据需要遵循几大现有标准,每一种标准都拥有自己的优势.短板.独特的W3C标准化状态以及浏览器支持级别.但无论如何,这些标准的实际表现都优于广泛存在的cookies机制. ...
- VMware Workstation 重启服务脚本 解决连不上ssh问题
解决虚拟机,每次启动连不上ssh问题,需要关闭虚拟机,再执行脚本.执行完后,再启动虚拟机就可以连上ssh啦! 脚本名称:vmware_server_restart.bat (请以管理员身份运行,否则可 ...
- KafkaConsumer对于事务消息的处理
Kafka添加了事务机制以后,consumer端有个需要解决的问题就是怎么样从收到的消息中滤掉aborted的消息.Kafka通过broker和consumer端的协作,利用一系列优化手段极大地降低了 ...
- 【Web】Javascript、Python、Django模板配合处理URL Encode
1.JS function relaunch(id, service, submit) { var username = $("#id_username").text(); /* ...
- 利用squid配置代理服务器-Fedora 19
我的系统: x86_64位Feodra 18 # yum install squid 不需要用户名密码认证的配置方式 edit /etc/squid/squid.conf # # Recommend ...
- Set 遍历的三种方法
1.迭代遍历:Set<String> set = new HashSet<String>();Iterator<String> it = set.iterator( ...