美文网首页
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