美文网首页
小白笔记之使用LRUCache的简单例子

小白笔记之使用LRUCache的简单例子

作者: 问荆_ | 来源:发表于2019-05-07 10:40 被阅读0次

    一、简单介绍 LRUCache

    • 1 Android的缓存主要就是内存缓存和硬盘缓存。这两种缓存机制的实现都用到了LRU算法。说到Lru其实是Least Recently Usead的缩写, 翻译过来就是最近(时间)最少使用
      LRU就是最近最少使用算法,这里我们只讲内存缓存。

    • 2 LRUCache是Android中封装好的缓存类,所以可以在Adroid中直接使用LRUCache来实现内存缓存,同时他也是泛型类,所以初始化的时候我们需要指定泛型。

    • 3 LRUCache把算法的部分基本都扔给了LinkedHashMap,通过LinkedHashMap来存储最近使用过的对象的引用。当内存满的时候会移除链表尾部的数据,即最不常用的数据。

    二、简单介绍LRUCache的使用

    • 1 设置LRUCache的缓存大小
    int maxMemory = (int) (Runtime.getRuntime().totalMemory()/1024);
           //设置缓存当前进程可用容量的1/8
            int cacheSize = maxMemory/8;
    
    • 2 定义LRUCache,指定泛型,并初始化LruCache
    //这里的是Integer类型,保存的数据是String类型,键和值不允许为null
    private LruCache<Integer,String> mData;
    mData = new  LruCache<Integer,String>(cacheSize);
    
    • 3 存储数据,LRUCache提供了put(key,value)方法来存储数据,这个方法是通过键(key)值(value)对来存储数据的。存储的数据就是value对应的数据。
            mData.put(1,"程序员");
            mData.put(2,"写代码");
            mData.put(3,"吃饭");
            mData.put(4,"睡觉");
    

    这里存储了4条数据。

    • 4 读取数据,LRUCache提供了get(key)方法来读取数据,这里key就是存储数据用到的key。
      
            String data1 = mData.get(1);
            String data2 =  mData.get(2);
            String data3 =  mData.get(3);
            String data4 =  mData.get(4);
            String data5 =  mData.get(5);
    

    这样就读取出了我们之前存储的数据。

    注意事项

    • 1 你要存储的数据的单位要和要和LRUCache的缓存的单位一样。
    • 2 你可以通过覆写LRUCache的sizeOf(key,value)方法来定义储存对象的大小,例如如果你要存储Bitmap类型的数据:
    LruCache<String,Bitmap>mMemoryCache;
    //这里最大缓存的单位是kb
    int maxMemory = (int) (Runtime.getRuntime().totalMemory()/1024);
            int cacheSize = maxMemory/8;
    mMemoryCache = new LruCache<String,Bitmap>(cacheSize){
                @Override
                protected int sizeOf(String key, Bitmap value) {
                    return value.getByteCount()/1024;
                }
            };
    

    这里我们写一个小demo来实现存储数据,读取数据,展示数据

    public class LRUCacheActivity extends AppCompatActivity {
        //定义LruCache
        private LruCache<Integer,String>mData;
        private TextView show;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_lrucache);
            //展示数据的TextView
            show = (TextView)findViewById(R.id.LruText);
            //存储和得到数据的Button
            Button save = (Button)findViewById(R.id.LRUSaveData);
            Button get =(Button)findViewById(R.id.getLRUData);
            save.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    saveData();
                }
            });
            get.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    showData(getData());
                }
            });
        }
    
        public void saveData(){
            //设置LruCache的最大缓存
            int maxMemory = (int)(Runtime.getRuntime().totalMemory()/1024);
            int cacheSize = maxMemory/8;
            //LruCache的初始化
           mData = new  LruCache<Integer,String>(cacheSize);
           //添加数据
            mData.put(1,"程序员");
            mData.put(2,"写代码");
            mData.put(3,"吃饭");
            mData.put(4,"睡觉");
        }
    
        public String getData(){
            String data = "";
            //获取数据
            for(int i = 1;i<6;i++){
                 data += mData.get(i) + "\n";
            }
           return  data;
        }
    
        public void showData(String data){
            //展示数据
            show.setText(data);
        }
    }
    

    这里有两个Button,一个用于存储数据,一个用于展示读取的数据,还有一个TextView用于展示数据。
    我们来看看效果:


    image.png

    这样我们就展示出了数据

    相关文章

      网友评论

          本文标题:小白笔记之使用LRUCache的简单例子

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