打开一张图片,先从缓存中找,如果没有,再去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缓存的更多相关文章

  1. 【SpringBoot1.x】SpringBoot1.x 缓存

    SpringBoot1.x 缓存 文章源码 JSR107 Java Caching 定义了 5 个核心接口,分别为: CachingProvider 定义了创建.配置.获取.管理和控制多个 Cache ...

  2. HashMap实现缓存(二)

    package com.cache; import java.util.*; //Description: 管理缓存 //可扩展的功能:当chche到内存溢出时必须清除掉最早期的一些缓存对象,这就要求 ...

  3. h5的离线缓存机制

    什么是Manifest: 其实Manifest是一个简单的 文本文件,它的扩展名是任意的,定义需要缓存的文件.资源,当第一次打开时,浏览器会自动缓存相应的资源. Manifest 的特点: 离线浏览: ...

  4. 初识Hibernate 缓存

    生活就像一杯咖啡,让你我慢慢的品尝,品尝它的苦涩和甘甜...... 一.什么是Hibernate缓存. 解析:白话来说就是缓存数据的容器 官方标准点缓存:是计算机领域的概念,它介于应用程序和永久性数据 ...

  5. jQuery源码解读 - 数据缓存系统:jQuery.data

    jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...

  6. Java 中常用缓存Cache机制的实现

    所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 所谓缓存,就是将程序或系统经常要调用的对象存在内存中 ...

  7. Java 中常用缓存Cache机制的实现《二》

    所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. AD: Cache 所谓缓存,就是将程序或系统经常要 ...

  8. 深入了解Hibernate的缓存使用

    Hibernate缓存 缓存是计算机领域的概念,它介于应用程序和永久性数据存储源(如在硬盘上的文件或者数据库)之间,其作用是降低应用程序 直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中 ...

  9. Java中常用缓存Cache机制的实现

    缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例. 这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文件 ...

随机推荐

  1. Log4j使用教程 log4:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).

    1.Logger类 通过Logger类的静态方法Logger.getRootLogger得到RootLogger.所有其他的loggers是通过静态方法Logger.getLogger来实例化并获取的 ...

  2. 实现JavaScript自定义函数的整合、链式调用及类的封装

    函数声明形式:表单验证函数 1 2 3 4 5 6 7 8 9 10 11 12 13 function checkName(){     console.log('检查用户名'); } functi ...

  3. R语言的前世今生(转)

    最近因病休养在家,另外也算是正式的离开Snack Studio.终于有了大把可以自由支配的时间.可以自主的安排.最近闲暇的时间总算是恶补了不少前段时间行业没有时间关注的新事物.看着行业里引领潮流的东西 ...

  4. 支付宝微信O2O大战,WiFi广告在夹缝中求生存

    支付宝微信O2O大战,WiFi广告在夹缝中求生存 来自工信部的数据显示,截至2013年底,中国智能手机的保有量已经达到5.8亿台.国内平均有46%的时间选择WiFi上网. 商用WiFi已经成为了移动互 ...

  5. 3月23.CSS表格布局

    360表格布局: CSS定义标签: @charset "utf-8";/* CSS Document */.bt1{ border:#309 solid 1px; height:1 ...

  6. POJ 1062 昂贵的聘礼

    C - 昂贵的聘礼 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit St ...

  7. NYOJ 61传纸条(一) 双线程DP问题

    http://www.cnblogs.com/HpuAcmer/archive/2012/05/06/2486591.html 题目链接:http://acm.nyist.net/JudgeOnlin ...

  8. BZOJ 3540 realtime-update 解题

    分析一下题意,大约是给定一串牛,然后找到一个跨越距离最长的牛子串使得在这个范围内白牛和花牛一样多. 白牛可以任意涂成花牛. 既然"白牛可以任意涂成花牛",那么我们需要找到一个最长的 ...

  9. win7 64位安装redis 及Redis Desktop Manager使用

    写基于dapper的一套自动化程序,看到 mgravell的另一个项目,StackExchange.Redis,之前在.NET上用过一段时间redis,不过一直是其它的驱动开发包,这个根据作者介绍,是 ...

  10. CentOS6.5以runlevel 3开机时自动连接某无线设置示例

    [参考]http://blog.csdn.net/simeone18/article/details/8580592 [方法一] 假设无线网卡代号为wlan0,无线AP的essid为:TheWiFi, ...