打开一张图片,先从缓存中找,如果没有,再去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();//更新数据。
}
}