Android开发图片加载的二级缓存实现

二级缓存

网络加载完数据以后再将数据存储在本地缓存的目录下。
应用在调用的时候,先判断是否有本地缓存,然后再考虑是否进行网络访问。


二级缓存实现方法

Created with Raphaël 2.1.0 网络下载 网络下载 本地缓存 本地缓存 加载图片类 加载图片类 图片下载完毕后,放入本地缓存 本地缓存提供给加载图片类数据 没有本地缓存就直接请求网络

由于需要访问文件夹,所以需要在ManiFest处开通相关的权限,如果是6.0的机器,需要动态访问相关的权限。


加载图片类

public class MyBitMapUtils {

    private NetCaCheUtils mNetCaCheUtils;
    private LocalCaCheUtils mLocalCacheUtils;

    public MyBitMapUtils(String tag) {
        mLocalCacheUtils = new LocalCaCheUtils();
        mNetCaCheUtils = new NetCaCheUtils(tag, mLocalCacheUtils);

    }

    public void display(ImageView mImage, String url) {
        //本地加载图片
        try {
            Bitmap bitmap = mLocalCacheUtils.getLocaCache(url);
            if (bitmap != null) {
                mImage.setImageBitmap(bitmap);
                Log.d(TAG, "display: " + "有本地缓存了");
                return;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //网络加载图片
        mNetCaCheUtils.getBitMapFromNet(mImage, url);
    }
}

本地缓存类

public class LocalCaCheUtils {
    private static final String LOCAL_CACHE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/zhbj_cache";

    //写本地缓存
    public void setLocalCache(String url, Bitmap bitmap) {
        File dir = new File(LOCAL_CACHE_PATH);
        if (!dir.exists() || !dir.isDirectory()) {
            dir.mkdirs();//创建文件夹
        }

        try {
            String fileName = MD5Encoder.encode(url);
            File cacheFile = new File(dir, fileName);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(cacheFile));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    //读本地缓存
    public Bitmap getLocaCache(String url) throws Exception {
        File cacheFile = new File(LOCAL_CACHE_PATH, MD5Encoder.encode(url));
        if (cacheFile.exists()) {
            Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(cacheFile));
            return bitmap;
        } else {
            return null;
        }

    }
}

网络缓存类

public class NetCaCheUtils {

    private ImageView imageView;
    private String url;
    private String tag;
    private LocalCaCheUtils mLocalCaCheUtils;
    /**
     * 传递settag的标识
     *
     * @param tag
     * @param mLocalCacheUtils
     */
    public NetCaCheUtils(String tag, LocalCaCheUtils mLocalCacheUtils) {
        mLocalCaCheUtils=new LocalCaCheUtils();
        this.tag = tag;
    }

    /**
     * 提供设置图片的方法
     * 传递两个参数
     *
     * @param mImage recycleview的view
     * @param url    下载地址
     */
    public void getBitMapFromNet(ImageView mImage, String url) {
        imageView = mImage;
        new BitMapTask().execute(mImage, url);
    }

    /**
     * 异步加载的方法
     */
    class BitMapTask extends AsyncTask<Object, Integer, Bitmap> {

        /**
         * 调用前使用的方法
         * 主线程运行
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        /**
         * 后台运行,在子线程运行
         *
         * @param params
         * @return
         */
        @Override
        protected Bitmap doInBackground(Object[] params) {
            imageView = (ImageView) params[0];
            url = (String) params[1];
            //下载图片
            Bitmap bitmap = null;
            try {
                bitmap = download(url);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return bitmap;
        }

        /**
         * 主线程运行,用于更新主线程UI
         *
         * @param result
         */
        @Override
        protected void onPostExecute(Bitmap result) {
            if (result != null) {
                imageView.setImageBitmap(result);
                try {
                    mLocalCaCheUtils.setLocalCache(url,result);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Log.d(TAG, "onPostExecute: 网络加载缓存了");
            }
        }

        //更新下载进度
        @Override
        protected void onProgressUpdate(Integer[] values) {
            super.onProgressUpdate(values);
        }

    }

    /**
     * 从网络下载图片的方法
     * @param url
     * @return
     * @throws IOException
     */
    public Bitmap download(String url) throws IOException {
        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setRequestMethod("GET");
        conn.setReadTimeout(5000);
        conn.setConnectTimeout(5000);
        int responseCode = conn.getResponseCode();
        if (responseCode == 200) {
            InputStream inputStream = conn.getInputStream();

            //根据输入流生成一个bitmap
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            return bitmap;
        }
        if (conn != null) {
            conn.disconnect();
        }
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值