美文网首页
Android中的缓存策略

Android中的缓存策略

作者: xbase | 来源:发表于2016-05-18 16:23 被阅读661次

    缓存分为:内存缓存+存储设备缓存,在Android中对应:LruCache+DiskLruCache.

    首先,LruCache(实现原理为LinkedHashMap)是3.1以后加入的一个api,可以使用v4包兼容至2.2版本。
    LruCache(线程安全)内部是一个LinkedHashMap以强引用的方式存储外界的缓存对象。

    • 强引用:直接的对象引用。
    • 软应用:当一个对象只有软应用存在时,系统内存不足时此对象会被gc回收。
    • 弱引用:当一个对象只有弱引用存在时,此对象会随时被回收。

    DiskLruCache(创建、缓存添加、缓存查找)

    1.创建
    使用DisLruCache.open(File directory,inter appVersion,int valueCount,long maxSize)方法

        - directory:缓存路径,如果想跟随应用被卸载而删除,请选择/sdcard/Android/data/package_name/cache
        - appVersion:版本号,一般填 1,如果升级为2时,缓存会被清除(开发时没必要清除缓存)。
        - valueCount:单个节点所对应的数据个数。一般为1。
        - maxSize:缓存总大小,注意单位为字节。
    

    2.缓存添加
    缓存添加时通过Editor(和sharedPreference相似)完成。
    图片缓存:

        - 获取图片url所对应的key(采用url的md5值作为key)
        - DiskLruCache.Editor editor = DiskLruCache.editor(key);
        - OUtputStream outputStream = editor.newOutputStream(DISK_CACHE_INDEX);因为一个节点只有一个数据,故DISK_CACHE_INDEX = 0;
        - 通过流将图片写入到文件中
        - 调用editor.commit()方法提交写操作。
    

    注意:写入完成后,记得关闭流。

    3.缓存查找

        - 通过url得到key,通过DiskLruCache.get(key)得到一个Snapshot对象
        - 通过Snapshot对象可以得到缓存的输入流,就能得到bitmap了。
    

    注意:这里bitmap要考虑OOM的问题,所以要进行缩放,但是文件输入流因为是优秀的文件流,所以不能两次调用decodeStream(第二次会为null),所以要通过文件流获取文件描述符,然后再通过BitmapFactory.decodeFileDescriptor方法加载缩放后的图片。

    相关文章

      网友评论

          本文标题:Android中的缓存策略

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