chche缓存
打开一张图片,先从缓存中找,如果没有,再去sccard中找,如果还没有,就去网络下载。下载好了以后,先保存到sdcard中,再保存到缓存中
public class ImageAsyncTask extends AsyncTask<String, Void, Bitmap> { private ImageView imageview;
private String image_url;
private Context context;
//在工作线程中执行。
@Override
protected Bitmap doInBackground(String... params) {
image_url = params[0];
//先从sdcard中判断这个地址的图片是否存在。
//图片的名称就以图片的地址来命名。
File file = context.getCacheDir();
Log.i("Main",file.getAbsolutePath()+"--文件的目录");
File file2 = new File(file,image_url);//只要new就会存在 ?
if(file2.exists()){
//直接取出来。
return BitmapFactory.decodeFile(file2.getAbsolutePath());
}else{
//创建文件。
//不存在sdcard中。---连网
Bitmap bitmap = HttpUtils.getBitmap(image_url);
//将图片存储到sdcard中
try {
boolean flag = file2.createNewFile();
Log.i("Main",flag+"是否创建成功");
FileOutputStream fos = new FileOutputStream(file2);
bitmap.compress(Bitmap.CompressFormat.JPEG,100,fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
} }
private LruCache<String,Bitmap> cache;
public ImageAsyncTask(ImageView imageView,Context context,LruCache<String,Bitmap> cache) {
this.context =context;
this.imageview = imageView;
this.cache =cache;
} @Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
//显示出来。
//获得控件的Tag
//放到缓存中。
cache.put(image_url,bitmap);
//在设置图片
String url = (String) imageview.getTag();
if (url.equals(image_url))
imageview.setImageBitmap(bitmap);
}
}
}
public class NewsAdapter extends BaseAdapter {
private Context context;
private List<News> list;
private LruCache<String,Bitmap> cache;
public NewsAdapter(Context context,List<News> list){
this.context = context;
this.list = list;
//cache对象
//得到手机的最大内存。
long maxMemory = Runtime.getRuntime().maxMemory();
cache = new LruCache<String, Bitmap>((int) (maxMemory/16)){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount()*value.getHeight();//返回一张图片的字节总数。
}
};
}
//表示数据的总数量
@Override
public int getCount() {
return list.size();
} //返回指定下标的对象
@Override
public News getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
} //显示每一条数据则会调用这个方法。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView==null){
convertView = LayoutInflater.from(context).inflate(R.layout.list_item,null);
viewHolder = new ViewHolder();
//找到控件。
viewHolder.imageView_item = (ImageView) convertView.findViewById(R.id.list_item_image);
viewHolder.tv_subject = (TextView) convertView.findViewById(R.id.list_item_subject);
viewHolder.tv_summary = (TextView) convertView.findViewById(R.id.list_item_summary);
viewHolder.tv_date = (TextView) convertView.findViewById(R.id.list_item_date);
//将viewHolder跟converView建立关系
convertView.setTag(viewHolder);
}
//convertView不是为空。
viewHolder = (ViewHolder) convertView.getTag();
//获得集合中指定下标的数据,并将数据显示在控件上。 //设置默认图片
viewHolder.imageView_item.setImageResource(R.mipmap.ic_launcher);
//得到图片的网址。
News news = list.get(position);
String news_url = Contants.NEWS_URL_HOST+ news.getCover();//网址
Bitmap bitmap = cache.get(news_url);//通过网址得到内存中图片。 if(bitmap!=null){
//设置图片
viewHolder.imageView_item.setImageBitmap(bitmap);
}else {
viewHolder.imageView_item.setTag(news_url);
Log.i("Main", news_url);
//下载图片或者从sdcard中读取图片。---开启异步任务
new ImageAsyncTask(viewHolder.imageView_item,context,cache).execute(news_url);
}
viewHolder.tv_summary.setText(news.getSummary());
viewHolder.tv_subject.setText(news.getSubject());
viewHolder.tv_date.setText(news.getChanged());
return convertView;
}
class ViewHolder{
ImageView imageView_item;
TextView tv_subject,tv_summary,tv_date;
}
//添加数据到集合中。
public void addData(List<News> news){
list.addAll(news);
notifyDataSetChanged();//更新数据。
}
}
chche缓存的更多相关文章
- 【SpringBoot1.x】SpringBoot1.x 缓存
SpringBoot1.x 缓存 文章源码 JSR107 Java Caching 定义了 5 个核心接口,分别为: CachingProvider 定义了创建.配置.获取.管理和控制多个 Cache ...
- HashMap实现缓存(二)
package com.cache; import java.util.*; //Description: 管理缓存 //可扩展的功能:当chche到内存溢出时必须清除掉最早期的一些缓存对象,这就要求 ...
- h5的离线缓存机制
什么是Manifest: 其实Manifest是一个简单的 文本文件,它的扩展名是任意的,定义需要缓存的文件.资源,当第一次打开时,浏览器会自动缓存相应的资源. Manifest 的特点: 离线浏览: ...
- 初识Hibernate 缓存
生活就像一杯咖啡,让你我慢慢的品尝,品尝它的苦涩和甘甜...... 一.什么是Hibernate缓存. 解析:白话来说就是缓存数据的容器 官方标准点缓存:是计算机领域的概念,它介于应用程序和永久性数据 ...
- jQuery源码解读 - 数据缓存系统:jQuery.data
jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...
- Java 中常用缓存Cache机制的实现
所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 所谓缓存,就是将程序或系统经常要调用的对象存在内存中 ...
- Java 中常用缓存Cache机制的实现《二》
所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. AD: Cache 所谓缓存,就是将程序或系统经常要 ...
- 深入了解Hibernate的缓存使用
Hibernate缓存 缓存是计算机领域的概念,它介于应用程序和永久性数据存储源(如在硬盘上的文件或者数据库)之间,其作用是降低应用程序 直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中 ...
- Java中常用缓存Cache机制的实现
缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例. 这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文件 ...
随机推荐
- SqlDataReader执行带输出参数存储过程 错误分析
在上一篇随笔:SqlDataReader读取分页数据,pageCount你是肿么了? 遇到了很让人头疼的问题:SqlDataReader执行带输出参数的存储过程总是获取不到输出参数的正确值.这里将解决 ...
- msmms (二) sms与mms 简述!
mms 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . MMS是英文缩写,它可以是Membership Management System的缩写,中文译名为会员管理系统.也可以是M ...
- ASP.NET MVC学习笔记-----Bundles
在网页中,我们经常需要引用大量的javascript和css文件,在加上许多javascript库都包含debug版和经过压缩的release版(比如jquery),不仅麻烦还很容易引起混乱,所以AS ...
- 基础知识系列☞Abstract和Virtual→及相关知识
转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...
- sql批量获取wordpress所有留言者的邮件地址
如果你的wordpress博客有很多读者互动的话,他们的留言都会留下具体的联系邮箱,我们如何批量导出这些联系信息呢?可以试试下面的sql语句 SELECT DISTINCT comment_autho ...
- Card(bestcoder #26 B)
Card Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.
在网上看到过一个面试题,感觉挺有意思,看别人的代码写的逻辑不够谨慎,重写了一个,较真了又... package com.array7.algorithm; public class Algorithm ...
- [Effective JavaScript 笔记]第47条:绝不要在Object.prototype中增加可枚举的属性
之前的几条都不断地重复着for...in循环,它便利好用,但又容易被原型污染.for...in循环最常见的用法是枚举字典中的元素.这里就是从侧面提出不要在共享的Object.prototype中增加可 ...
- mongo链接报错:couldn't connect to server 127.0.0.1:27017 (127.0.0.1)
angela@angeladeMacBook-Air:/data/db$mongo MongoDB shell version: 2.6.1 connecting to: test 2014-06-0 ...
- 关于 datasnap Stream的英文博客能容
转载:http://blogs.embarcadero.com/jimtierney/2009/04/06/31461/ DataSnap Server Method Stream Parameter ...