当前位置:首页 > 芯闻号 > 充电吧
[导读]对于Lru算法的理解Lru算法,将命中率不高的空间释放掉,保留命中率较高的空间。这种算法有一种实现方式:创建的对象通过队列保存起来,如果对一个对象进行了访问,就将这个对象放到队列的开头,新加入的对象也

对于Lru算法的理解

Lru算法,将命中率不高的空间释放掉,保留命中率较高的空间。

这种算法有一种实现方式:创建的对象通过队列保存起来,如果对一个对象进行了访问,就将这个对象放到队列的开头,新加入的对象也会放在队列的开头(也就是说,队列开头一定是新加入的或者是常用的对象)。当队列长度超过了限额时,将队列尾部的对象释放即可。

对于LruCache的使用

在Android中有LruCache类,该类使用了Lru算法对内存缓存进行有效管理。LruCache是在android 3.1之后出来的,如果在老版本希望使用该类,需要使用v4包。

1. 创建LruCache对象,该类是一个泛型类,Value用来表明缓存的数据类型

lruCache = new LruCache(MAX_SIZE);参数表明缓存的最大空间以byte为单位

By default, the cache size is measured in the number of entries. Override sizeOf(K, V) to size the cache in different units

官网指出,LruCache在检测空间时是使用的元素个数作为单位的,比如:

lruCache.put("b0", BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));

lruCache.put("b1", BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));

此时,lruCache的大小为2,因为只缓存了2个元素。

因此,我们需要重写sizeOf方法,使用元素的大小作为返回值

lruCache = new LruCache(MAX_SIZE) {

@Override

protected int sizeOf(String key, Bitmap value) {

// TODO Auto-generated method stub

return value.getByteCount();

}

};

2. 向缓存中存入对象

lruCache.put("b0", BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));

3. 从缓存中取出缓存对象

lruCache.get("b0")

如果,缓存对象被销毁了,返回null

利用LruCache也可以实现软引用类似的效果,但是个人认为还是有缺陷的,比如:在LruCache的MAX_SIZE这个问题上就不好确定了。如果设置的太小,可能缓存一张图片就会OOM。

对于DiskLruCache的使用

在Android中还有一个DiskLruCache类,该类使用Lru算法对磁盘缓存进行管理

在Android4.0之前使用该类时,需要将该类的源文件下载到项目中,才能使用。

1. 将DiskLruCache文件拷贝到项目中

2. 创建DiskLruCache对象

//参数1:用来缓存的目录

//参数2:应用程序版本

//参数3:the number ofValues per cache entry. Must be positive

//参数4:缓存空间的大小,byte为单位

mDiskLruCache = DiskLruCache.open(f, 1, 1, MAX_SIZE);

3. 向缓存写入数据

3.1

//设置缓存的key,这个key会作为缓存的文件名

DiskLruCache.Editor editor = mDiskLruCache.edit("f1");

3.2 创建输出流

//newOutputStream(0)中的参数会作为文件名的后缀,表示从通道几写入的

OutputStream outputStream = editor.newOutputStream(0);

3.3 向输出流写数据

BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher).compress(Bitmap.CompressFormat.PNG, 0, outputStream);

3.4 提交

editor.commit();

4. 从缓存中获取数据

4.1 获取key对应的 snapshot,如果空间被释放,返回null

Snapshot snapshot=diskLruCache.get(key);

4.2 从snapshot中获取输入流,参数表示通道号,和

editor.newOutputStream(0)对应

snapshot.getInputStream(0)


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭