美文网首页
lrucache内存缓存的使用

lrucache内存缓存的使用

作者: sindorina | 来源:发表于2018-10-18 14:24 被阅读0次

定义imageLoader

public class ImageLoader {
    private LruCache<String,Bitmap> lruCache;
    private static volatile ImageLoader loader;
    private static String url;
    private ExecutorService pool = null;
    private ImageView imageView;
    private ImageLoader() {
        long size = Runtime.getRuntime().maxMemory();
        lruCache = new LruCache<String,Bitmap>((int) (size/8)){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };
    }
    private static ImageLoader getInstance(){
        if (loader == null){
            synchronized (ImageLoader.class){
                if (loader == null){
                    loader = new ImageLoader();
                }
            }
        }
        return loader;
    }
    public static ImageLoader loadUrl(String url){
        ImageLoader.url = url;
        return getInstance();
    }

    public void into(ImageView imageView){
        this.imageView = imageView;
        Bitmap bitmap = getBitmapFromCache(url);
        if (bitmap == null){
            downloadImage(url);
        }else {
            imageView.setImageBitmap(bitmap);
            Log.e("ImageLoader","图片缓存");
        }
    }
    /**
     * 添加图片到缓存
     * @param url
     * @param bitmap
     */
    private void addBitmapToCache(String url,Bitmap bitmap){
        lruCache.put(url,bitmap);
    }

    /**
     * 从缓存中移除指定图片
     * @param url
     */
    public void removeBitmapFromCache(String url){
        lruCache.remove(url);
    }

    /**
     * 从缓存读取指定图片
     * @param url
     */
    private Bitmap getBitmapFromCache(String url){
        return lruCache.get(url);
    }
    private void downloadImage(String url){

        if (pool == null){
            synchronized (ExecutorService.class){
                if (pool == null){
                    pool = Executors.newFixedThreadPool(10);
                }
            }
        }
        pool.execute(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                try {
                    URL url1 = new URL(url);
                    connection = (HttpURLConnection) url1.openConnection();
                    connection.setConnectTimeout(10 * 1000);
                    connection.setReadTimeout(10 * 1000);
                    connection.setDoInput(true);
                    connection.setRequestMethod("GET");
                    Bitmap bitmap = BitmapFactory.decodeStream(connection.getInputStream());
                    addBitmapToCache(url,bitmap);
                    Message message = Message.obtain();
                    message.obj = bitmap;
                    message.what = 200;
                    imageHandler.sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.e("ImageLoader","网络错误");
                }
            }
        });
    }
    private Handler imageHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            if (msg.what == 200){
                Log.e("ImageLoader","图片来源网络");
                Bitmap bitmap = (Bitmap) msg.obj;
                imageView.setImageBitmap(bitmap);
            }
            return false;
        }
    });
}

使用imageLoader

ImageLoader.loadUrl(url).into(imageView);

相关文章

  • Glide 缓存机制-源码解析

    Glide分为内存缓存和硬盘缓存两种内存缓存默认开启,使用的算法是LruCache算法(Least Recentl...

  • Glide缓存策略

    1.内存缓存 正在使用中的图片使用弱引用来进行缓存,不在使用中的图片使用LruCache来进行缓存 2.硬盘缓存 ...

  • LruCache的实现原理(图片三级缓存)

    官方建议使用lrucache进行内存缓存。Lrucache底层实际是维护的一个linkedHashMap集合(他是...

  • 最近最少使用算法 - LruCache

    简介 我们在做图片三级缓存时,内存缓存为了防止内存溢出,导致APP崩溃,使用LruCache来管理内存...

  • DiskLruCache详解

    上一节,我们了解了LruCache的使用,我们知道LruCache是从内存中去获取缓存信息。但内存大小是有限的,因...

  • LruCache源码分析

    在Android中常用的缓存策略是LruCache和DiskLruCache其中LruCache常被用作内存缓存。...

  • Android - LruCache 内存缓存

    什么是 LruCache 是一种内存缓存对象,使用 LRU(Least Recent Used)算法管理缓存。 缓...

  • Bitmap的缓存结构设计

    1. 整体思路设计 采用三级缓存结构:内存-磁盘-网络,缓存使用的是LruCache算法,最近最少使用缓存算法 内...

  • Android图片缓存策略(二)-LruCache、DiskLr

    1 简介 目前比较常用的缓存策略是LruCache和DiskLruCache,其中LruCache常被用做内存缓存...

  • Android 两种缓存方式介绍

    Android缓存分为内存缓存和磁盘缓存。 内存缓存(LruCache) 在早期的 Android 2.x 时代,...

网友评论

      本文标题:lrucache内存缓存的使用

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