• 三级缓存


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

     

  • 相关阅读:
    .net 2.0 使用linq
    重建索引解决mssql表查询超时的问题
    倾斜摄影自动化建模成果的数据组织和单体化
    cesium导入3D模型(obj转gltf)
    github
    JSP转发和重定向的区别
    mysql压缩版的安装教程
    JSP内置对象
    运行jsp常犯的错误
    递归的几个demo
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5383935.html
Copyright © 2020-2023  润新知