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

来源:互联网 发布:相声知乎 编辑:程序博客网 时间:2024/05/21 07:26

学习分享:

一、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
原创粉丝点击