打开一张图片,先从缓存中找,如果没有,再去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. 新浪微博客户端(9)-实现版本新特性的ViewPager

    "DJNewFeatureViewController.m" #import "DJNewFeatureViewController.h" #define NE ...

  2. ASP.NET MVC中通过Request.IsAjaxRequest()来判断是否要加载公共视图

    个人目测 Request.IsAjaxRequest()这个东西是判断前台提交过来的header中的 X-Requested-With:XMLHttpRequest来区分是不是ajax请求的. ASP ...

  3. Linux无法使用userdel删除用户和组的解决办法

    转自:http://www.linuxidc.com/Linux/2013-07/87371.htm 简述: 今天在看书的时候,看到有个实例,手痒痒的跟着做了起来...但是,出现问题了..测试的用户和 ...

  4. Dean Edwards大神写的addEvent库

    直接晒代码: // written by Dean Edwards, 2005 // with input from Tino Zijdel, Matthias Miller, Diego Perin ...

  5. TableInputFormat分片及分片数据读取源码级分析

    我们在MapReduce中TextInputFormat分片和读取分片数据源码级分析 这篇中以TextInputFormat为例讲解了InputFormat的分片过程以及RecordReader读取分 ...

  6. Card(bestcoder #26 B)

    Card Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. smb

    smb编辑 SMB(Server Message Block)是协议名,它能被用于Wap连接和客户端与服务器之间的信息沟通.

  8. 深入理解Java中的继承

    对于面向对象的程序设计而言,每一个程序员都应该去了解Java中的封装,继承和多态,那么我今天来说的主要是以继承为核心的主题. 一.关于对继承的理解. 继承是面向对象的三大特性之一,是java中实现代码 ...

  9. 专注docker安全:Security Scanning

    导读 Docker毫无疑问是近期运维同学们的热点话题,Docker安全也由此倍受重视,Docker Security Scanning 是一款Docker镜像扫描的安全工具,目前已经在Docker C ...

  10. 多层神经网络与C++实现

    BP理论部分参考:http://blog.csdn.net/itplus/article/details/11022243 参考http://www.cnblogs.com/ronny/p/ann_0 ...