Android Lru的简单使用

Lru 算法(缓存淘汰算法)

LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。(PS:有兴趣可以用链表自己实现)

Android LruCache

在Android LruCache中的原理比较简单,有兴趣可以自己去了解.具体的代码这里就不放了. 

 

1 LruCacheIMG 类

   这里采用单例模式,主要原因是 在App中不是只有一处需要加载图片和缓存图片

    private LruCacheIMG(){
        Runtime t = Runtime.getRuntime();
        // 这里用app 运行内存的 1/8 作为缓存图片的能缓存的最大容量
        // 图片现在一般都比较大,但是也不能给过多的内存
        int max = (int) (t.maxMemory()/8);
        mLrc = new LruCache<String, Bitmap>(max){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };
    }
    private static LruCacheIMG Init()
    {
        if (lruCacheImg == null)
        {
            synchronized (LruCacheIMG.class){
                lruCacheImg = new LruCacheIMG();
            }
        }
        return lruCacheImg;
    }
    // 这里采用单例模式,因为不是只有一个地方需要去加载图片

    private static LruCacheIMG getInstance()
    {
        return lruCacheImg == null ? Init() : lruCacheImg;
    }

2 主要功能display downloadIMG getBitMap

     disPlay 接受到传过来的url 和 view 利用getBitMap 获取存在LrcCache中的Bitmap 

    如果存在 就加载 如果不存在呢? 那么就去下载

    注意 子线程是不能更改UI的

    public static void disPlay(ImageView view,String url)
    {
        Bitmap bitmap = getInstance().getBitMap(url);
        if (bitmap == null)
        {
            getInstance().DownLoadImg(view,url);
        }else {
            view.setImageBitmap(bitmap);
        }

    }
    private Bitmap getBitMap(String url)
    {
        return mLrc.get(url);
    }

    private void DownLoadImg(final ImageView view, final String url)
    {
        new Thread(new Runnable() {
            @Override
            public void run() {
                URL imgURL = null;
                try {
                    imgURL = new URL(url);
                }catch (MalformedURLException e){
                    e.printStackTrace();
                }
                try {
                    HttpsURLConnection conn = (HttpsURLConnection) imgURL.openConnection();
                    conn.connect();
                    // 这里假设一定可以从网络获取到图片
                    InputStream is = conn.getInputStream();
                    Bitmap bitmap = BitmapFactory.decodeStream(is);
                    is.close();
                    mLrc.put(url,bitmap);
                    Message msg = new Message();
                    Iview = view;
                    msg.obj = url;
                    handler.sendMessage(msg);
                }catch (IOException e){
                    e.printStackTrace();
                }

            }
        }).start();
    }

3 主要代码如下

public class LruCacheIMG {

    private static LruCache<String,Bitmap> mLrc;
    private static LruCacheIMG lruCacheImg;
    private ImageView Iview;
    private android.os.Handler handler = new android.os.Handler(new android.os.Handler.Callback() {
        @Override
        public boolean handleMessage(Message message) {
            String url = (String) message.obj;
            if (Iview != null)
                Iview.setImageBitmap(getBitMap(url));
            return true;
        }
    });
    private LruCacheIMG(){
        Runtime t = Runtime.getRuntime();
        int max = (int) (t.maxMemory()/8);
        mLrc = new LruCache<String, Bitmap>(max){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };
    }
    private static LruCacheIMG Init()
    {
        if (lruCacheImg == null)
        {
            synchronized (LruCacheIMG.class){
                lruCacheImg = new LruCacheIMG();
            }
        }
        return lruCacheImg;
    }

    private static LruCacheIMG getInstance()
    {
        return lruCacheImg == null ? Init() : lruCacheImg;
    }

    public static void disPlay(ImageView view,String url)
    {
        Bitmap bitmap = getInstance().getBitMap(url);
        if (bitmap == null)
        {
            getInstance().DownLoadImg(view,url);
        }else {
            view.setImageBitmap(bitmap);
        }

    }
    private Bitmap getBitMap(String url)
    {
        return mLrc.get(url);
    }

    private void DownLoadImg(final ImageView view, final String url)
    {
        new Thread(new Runnable() {
            @Override
            public void run() {
                URL imgURL = null;
                try {
                    imgURL = new URL(url);
                }catch (MalformedURLException e){
                    e.printStackTrace();
                }
                try {
                    HttpsURLConnection conn = (HttpsURLConnection) imgURL.openConnection();
                    conn.connect();
                    // 这里假设一定可以从网络获取到图片
                    InputStream is = conn.getInputStream();
                    Bitmap bitmap = BitmapFactory.decodeStream(is);
                    is.close();
                    mLrc.put(url,bitmap);
                    Message msg = new Message();
                    Iview = view;
                    msg.obj = url;
                    handler.sendMessage(msg);
                }catch (IOException e){
                    e.printStackTrace();
                }

            }
        }).start();
    }
}

 这只是自己做的一个简单的demo,如果其中有写的不好的地方,还望各位能够指出.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值