微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

单一职责之ImageLoader(四增加sd卡缓存

public class ImageCache {
    //图片缓存
    LruCache<String,Bitmap> mImageCache;
    public ImageCache(){

    }
    private void initimageCache(){
        //计算可用的最大内存
        final int maxMemory = (int)(Runtime.getRuntime().maxMemory()/1024);
        //取四分之一内存作为缓存
        final int cacheSize = maxMemory/4;
        mImageCache = new LruCache<String,Bitmap>(cacheSize){
            @Override
            protected int sizeOf(String key,Bitmap value) {
                return value.getRowBytes()*value.getHeight()/1024;
            }
        };
    }
    public void put(String url,Bitmap bitmap){
        mImageCache.put(url,bitmap);
    }

    public Bitmap get(String url){
        return mImageCache.get(url);
    }
}
public class diskCache {
    static String cacheDir = "sdcard/cache/";
    //从缓存中获取图片
    public Bitmap get(String url){
        return BitmapFactory.decodeFile(cacheDir+url);
    }
    //将图片缓存到内存中
    public void put(String url,Bitmap bmp){
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(cacheDir + url);
            bmp.compress(Bitmap.CompressFormat.PNG,100,fileOutputStream);
        } catch (FileNotFoundException e) {
            e.printstacktrace();
        }finally {
            if(fileOutputStream != null){
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printstacktrace();
                }
            }
        }

    }
}
public class ImageLoader {
    //图片内存缓存
    ImageCache mImageCache = new ImageCache();
    //图片sd卡缓存
    diskCache mdiskCache = new diskCache();
    //是否使用sd卡缓存
    boolean isUsediskCache = false;
    //线程池 线程数量cpu数量

    //线程池
    ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().
            availableProcessors());



    //显示网络加载的图片 调用一次都会开启线程去下载 并且显示
    public void displayImage(final String url,final ImageView imageView){
        //判断使用哪种缓存
        Bitmap bitmap = isUsediskCache?mdiskCache.get(url):mImageCache.get(url);
        if(bitmap != null){
            imageView.setimageBitmap(bitmap);
            return;
        }
        //没有缓存则给线程池下载
        imageView.setTag(url);
        mExecutorService.submit(new Runnable() {
            @Override
            public void run() {
                Bitmap bitmap = downloadImage(url);
                if(bitmap == null){
                    return ;
                }
                if(imageView.getTag().equals(url)){
                    imageView.setimageBitmap(bitmap);
                }
                //使用内存缓存 或者sd卡缓存
                if(isUsediskCache){
                    mdiskCache.put(url,bitmap);
                }else{
                    mImageCache.put(url,bitmap);
                }

            }
        });
    }

    public Bitmap downloadImage(String imageUrl){
        Bitmap bitmap = null;
        try {
            URL url = new URL(imageUrl);
            final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            bitmap = BitmapFactory.decodeStream(conn.getInputStream());
            conn.disconnect();
        } catch (Exception e) {
            e.printstacktrace();
        }
        return bitmap;
    }
}
e

缺陷sd卡缓存和内存缓存只能选择其中一个,应该设计成双缓冲策略。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐