美文网首页
Android 简单实现图片加载缓存

Android 简单实现图片加载缓存

作者: 请叫我果爸 | 来源:发表于2018-08-15 21:01 被阅读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

相关文章

网友评论

      本文标题:Android 简单实现图片加载缓存

      本文链接:https://www.haomeiwen.com/subject/dclgbftx.html