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

前端之家收集整理的这篇文章主要介绍了单一职责之ImageLoader(四)增加sd卡缓存前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
public@H_403_2@ class@H_403_2@ ImageCache {
    //图片缓存@H_403_2@
    LruCache<String,Bitmap> mImageCache;
    public@H_403_2@ ImageCache@H_403_2@(){

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

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

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

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



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

            }
        });
    }

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

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

猜你在找的设计模式相关文章