Android缓存机制:LruCache+AsyncTask缓存和显示网络图片

学习分享:

一、LruCache+AsyncTask缓存和显示网络图片

1.生成LruCache对象

 private final int size = (int)Runtime.getRuntime().maxMemory(); //获取手机RAM

private LruCache<String,Bitmap> lruCache = new LruCache<String,Bitmap>(size/7){
        @Override
        protected int sizeOf(String key, Bitmap value) {//重写此方法,返回给系统正确的size值(默认返回1)
            return value.getByteCount();
        }
    };

2.LruCache常用方法:put(key,value)存入,get(key)取出对应的值

3.加入异步:

逻辑:先从LruCache(RAM缓存)获取,如果获取到的bitmap是空,则进行异步任务(去网络上解析图片得到对应bitmap,在onPostExecute()方法中将bitmap设置进ImageView)

加载图片工具类:

/**
 * Created by Administrator on 2016/9/12.
 * 图片工具类
 */
public class ImgLoadUtil {
    private Bitmap bitmap;
    private final int size = (int)Runtime.getRuntime().maxMemory();	//获取手机RAM
    /**
     * 生成缓存对象
     * 申请RAM空间最大是(手机RAM/7     */
    private LruCache<String,Bitmap> lruCache = new LruCache<String,Bitmap>(size/7){
        @Override
        protected int sizeOf(String key, Bitmap value) {
            return value.getByteCount();
        }
    };

    /**
     * 对外接口(adapter调用—在adapter中生成成员ImageLoadUtil对象,生成设置ImageView的图片时调用)
     * 获取网络地址对应的图片
     * 1.从缓存中获取
     * 2.获取失败则去网络中加载
     * @param imgUrlString
     * @return
     */
    public Bitmap getBitmapfromUrl(String imgUrlString,ImageView imageView){
        bitmap = lruCache.get(imgUrlString);
        if(bitmap == null){
            //从网络获取
            LogTool.e("网络获取");
            new ImgAsyncTask(imageView).execute(imgUrlString);
        }else{
            LogTool.e("缓存获取");
        }
        return bitmap;//这里还有问题回去修改
    }

    /**
     * Bitmap添加到缓存
     * @param imgUrl key)图片对应的URL字符串(网址)
     * @param bitmap  (value)要存入的值
     */
    private void addToLrucache(String imgUrl, Bitmap bitmap){
        if(bitmap != null)
            lruCache.put(imgUrl,bitmap);
    }

    /**
     * 异步任务类(内部类)
     */
    class ImgAsyncTask extends AsyncTask<String,Void,Bitmap>{
        private String imgurl = "";
        ImageView imageView;

        /**
         * 传进来的ImageView,后台任务完成后将获取到bitmap设置进ImageView
         * @param imageView
         */
        public ImgAsyncTask(ImageView imageView) {
            this.imageView = imageView;
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            imgurl = params[0];
            return BitmapUtil.getBitmapFromURL(params[0]);
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            ImgLoadUtil.this.bitmap = bitmap;
            imageView.setImageBitmap(bitmap);//ImageView设置图片
            addToLrucache(imgurl,bitmap);
        }
    }
}
adapter——getView方法中调用

/**
 * 调用ImgLoadUtilgetBitmapfromUrl方法
 * imgLoadUtil 是一个成员变量
 */
Bitmap bitmap = imgLoadUtil.getBitmapfromUrl(list.get(position).getPicUrl(),myHolder.imageView);
if(bitmap == null){
    //获取到的bitmap是空则给予一个默认值
    bitmap = FragFallow_beautifulGirl.bitmap;
}
myHolder.imageView.setImageBitmap(bitmap);
获取网络地址对应的bitmap

/**
 * Created by Administrator on 2016/9/12.
 */
public class BitmapUtil {
    /**
     * 获取网络图片,转换成Bitmap
     * @param imgURL
     * @return
     */
    public static Bitmap getBitmapFromURL(String imgURL){
        Bitmap bitmap = null;
        try {
            URL url = new URL(imgURL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setReadTimeout(5000);
            connection.setDoInput(true);
            connection.connect();
            bitmap = BitmapFactory.decodeStream(connection.getInputStream());
            connection.disconnect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值