Android 简单实现图片加载缓存

2018-08-15  本文已影响0人  请叫我果爸

使用图片缓存的原因

什么是图片三级缓存

内存缓存

获取系统分配给应用的最大内存。取一部分用来进行图片缓存

    private ImageLoader(Context context) {
        // 开启线程池 最小线程数
        executor = new ThreadPoolExecutor(1, 5, 2, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());
        // 获取系统分配给应用程序的最大内存
        int maxMemory = (int) Runtime.getRuntime().maxMemory();
        int maxSize = maxMemory / 8;
        lruCache = new LruCache<String, Bitmap>(maxSize) {

            @Override
            protected int sizeOf(String key, Bitmap value) {
                // 测量Bitmap的大小 默认返回图片数量
                return value.getRowBytes() * value.getHeight();
            }

        };

        utils = new FileUtils(context);
        handler = new MyHandler();
    }

本地缓存

本地在应用的目录下生成一个img文件夹,用来存放本地缓存的图片

    public void savaBitmap(String url, Bitmap bitmap) throws IOException {
        if (bitmap == null) {
            return;
        }
        String path = getStorageDirectory();
        File folderFile = new File(path);
        if (!folderFile.exists()) {
            folderFile.mkdirs();
        }
        File file = new File(path + File.separator + getFileName(url));
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
    }

获取本地缓存的图片

    public Bitmap getBitmap(String url) {
        return BitmapFactory.decodeFile(getStorageDirectory() + File.separator + getFileName(url));
    }

网络缓存

从内存缓存和本地缓存中获取图片

    public Bitmap showCacheBitmap(String url) {
        Bitmap bitmap = getMemoryBitmap(url);
        if (bitmap != null) {
            return bitmap;
        } else if (utils.isFileExists(url) && utils.getFileSize(url) > 0) {
            bitmap = utils.getBitmap(url);
            lruCache.put(url, bitmap);
            return bitmap;
        }
        return null;
    }

当内存缓存和网络缓存中不存在,就去网络加载

    public void downLoader(final String url, final ImageLoaderlistener loaderlistener) {
        if (url != null) {
            final Bitmap bitmap = showCacheBitmap(url);//这里就是从缓存中去找图片
            if (bitmap != null) {                     //如果缓存中返回的图片为空的,则开启线程进行下载
                loaderlistener.onImageLoader(bitmap);
            } else {
                executor.execute(new Runnable() {
                    @Override
                    public void run() {
                        Bitmap bitmap = HttpClient.getBitmapFormUrl(url);
                        if (bitmap != null) {                      //下载完毕之后将图片保存到缓存和本地,然后通知ImageView更新UI
                            handler.setListener(loaderlistener);
                            handler.sendMessage(handler.obtainMessage(LOAD_SUCCESS, bitmap));
                            lruCache.put(url, bitmap);
                            try {
                                utils.savaBitmap(url, bitmap);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                });
            }
        }
    }



github下载地址:https://github.com/PanBeixing/CustomImageLoad

上一篇下一篇

猜你喜欢

热点阅读