三级缓存

2021年09月15日 阅读数:1
这篇文章主要向大家介绍三级缓存,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

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