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