打开一张图片,先从缓存中找,如果没有,再去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. PHP中array_chunk的用法

    转自:http://cn2.php.net/manual/zh/function.array-chunk.php (PHP 4 >= 4.2.0, PHP 5) array_chunk — 将一 ...

  2. CSS居中完全解决方案

    上次面试面试官问到了,问了个定宽局中和不定宽局中,下来我把所有有关CSS居中都总结了一下 原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 水平居中 行内元素 把行内元素 ...

  3. App架构设计经验谈:服务端接口的设计

    App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 安全机制的设计 现在,大部分App的接口都采用RESTful架构,RESTFul最重要的 ...

  4. HttpWatch详解

    一 概述: HttpWatch强大的网页数据分析工具.集成在Internet Explorer工具栏.包括网页摘要.Cookies管理.缓存管理.消息头发送/接受.字符查询.POST 数据和目录管理功 ...

  5. mac安装最新版本的git

    文章转载自我的个人博客 http://www.iwangzheng.com/ 1.下载一个安装包哦 在mac下安装git,首先下载一个git安装包,这里我选的是git-1.9.3.tar , 因为这是 ...

  6. QEMU 使用的镜像文件:qcow2 与 raw

    qcow2 的基本原理 qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像.它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘.与普通的 raw 格式的镜像相比,有以下特性: 更小的空间 ...

  7. Java单链表、双端链表、有序链表实现

    单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见htt ...

  8. 3.django笔记之form表单

    作者:刘耀 瞎copy伸手党 我在诅咒你. Django的form的作用: 1.生成html标签 2.用来做用户提交的验证 3.可以和models一起使用(modelform) 一.form基础 工程 ...

  9. Java 复制文件的高效方法

    转载自:http://jingyan.baidu.com/article/ff4116259c2d7712e4823780.html 在Java编程中,复制文件的方法有很多,而且经常要用到.我以前一直 ...

  10. 【HTTP协议】响应头中的Content-Length和Transfer-Encoding

    来源: http://blog.csdn.net/superhosts/article/details/8737434 http://bbs.csdn.net/topics/390384017 对于h ...