Android内存优化之内存缓存
前言:
什么是缓存?
为什么要用到缓存?
Android中的图片缓存有哪些?各有什么特点?
内存缓存:
- 分配LruCache大小的时候考虑你的应用剩余内存有多大;
- 一次屏幕显示多少张图片,有多少张图片是缓存起来准备显示的;
- 考虑你的手机分辨率和尺寸, 缓存相同的图片个数,dpi越大的手机需要的内存就会越大,我的一篇博客中有讲解;
- 图片分辨率和像素质量也决定了占用内存的大小;
- 图片访问的频繁程度是多少,是不是有一些图片是经常访问的?如果存在你可以考虑用多个LruCache来做缓存,按照访问的频率度分配到不同的LruCache中;
- 如何平衡一下图片质量和数量,有些时候可以考虑缓存低分辨率的图片,用到的时候再在后台请求更高质量的图片;
private LruCache<String, Bitmap> mMemoryCache;//声明缓存空间
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);//获取应用在系统中的最大内存分配
//分配1/8的应用内存作为缓存空间
final int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
//重写sizeOf方法,返回图片的占用字节数而不是图片的个数,每次添加图片是会被调用
return bitmap.getByteCount() / 1024;
}
};
intcacheSize=4*1024*1024;// 4MiB
LruCachebitmapCache=newLruCache(cacheSize){
protectedintsizeOf(Stringkey,Bitmapvalue){
returnvalue.getByteCount();
}
}
这两个sizeOf的计算是不一样的,这里说明一下,这个方法重写的目的是返回图片占用的缓存空间而不是图片的数目,并且这个数值的单位要和cacheSize一样。
总结:
- LruCache封装了LinkedHashMap,提供了LRU(Least Recently Used 最近最少使用算法)缓存的功能;
- LruCache通过trimToSize方法自动删除最近最少访问的键值对;
- LruCache不允许空键值, LinkedHashMap允许;
- LruCache线程安全, LinkedHashMap线程不安全;
- 继承LruCache时,必须要复写sizeOf方法,用于计算每个条目的大小。在put和get的时候会调用safeSizeOf(K key, V value),safeSizeOf(K key, V value)会调用 sizeOf (K key, V value),这个方法默认返回1。
关注微信公众平台:程序员互动联盟(coder_online),你可以第一时间获取原创技术文章,和(java/C/C++/Android/Windows/Linux)技术大牛做朋友,在线交流编程经验,获取编程基础知识,解决编程问题。程序员互动联盟,开发人员自己的家。

Android内存优化之内存缓存的更多相关文章
- [Android 性能优化系列]内存之基础篇--Android怎样管理内存
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...
- [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...
- 老李分享:Android性能优化之内存泄漏1
老李分享:Android性能优化之内存泄漏 前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我 ...
- Android 性能优化之内存泄漏检测以及内存优化(中)
https://blog.csdn.net/self_study/article/details/66969064 上篇博客我们写到了 Java/Android 内存的分配以及相关 GC 的详细分析, ...
- Android内存优化之磁盘缓存
前言: 在上一篇文章中介绍了内存缓存,内存缓存的优点就是很快,但是它又有缺点: 空间小,内存缓存不可能很大: 内存紧张时可能被清除: 在应用退出时就会消失,做不到离线: 基于以上的缺点有时候又需要另外 ...
- Android性能优化之内存篇
下面是内存篇章的学习笔记,部分内容与前面的性能优化典范有重合,欢迎大家一起学习交流! 1)Memory, GC, and Performance 众所周知,与C/C++需要通过手动编码来申请以及释放内 ...
- Android内存优化9 内存检测工具3 MAT比Menmery Monitor更强大
在Android性能优化第(一)篇---基本概念中讲了JAVA的四大引用,讲了一下GCRoot,第二篇Memory Monitor检测内存泄露仅仅说了Menmery Monitor的使用,这篇博客谈一 ...
- python性能优化、内存优化、内存泄露;与其他语音比较效率如何?
1.内存泄露:http://www.cnblogs.com/xybaby/p/7491656.html 2.内存优化:http://www.cnblogs.com/xybaby/p/7488216.h ...
- Android内存优化7 内存检测工具1 Memory Monitor检测内存泄露
上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出 ...
随机推荐
- P3047 [USACO12FEB]附近的牛Nearby Cows
https://www.luogu.org/problemnew/show/P304 1 #include <bits/stdc++.h> 2 #define up(i,l,r) for( ...
- redis学习-string常用命令
keys * :查询所有的key值 set:为指定键设置对应的值 get:获取指定键的值 mset:一次传入多个键值对 mget:一次获取多个键的值 del:删除指定键 strlen:获取指定键值的长 ...
- temp--内蒙农信(环境)
规章制度篇: 1, 内蒙农信办公地址: 呼和浩特市赛罕区内蒙古自治区农村信用社联合社(陶利街) 农金大厦1201室. 2, 电子版蓝底照片(办饭卡,自己充钱) , 行里面吃饭标准 早餐8元.午 ...
- python线程的同步事件Event
Event对象: 用于线程间的通信,某个线程需要根据其他线程的状态来判断自己的下一步操作. Event内部定义了一个全局变量:_flag,默认为False. 当_flag = False时,会阻塞当前 ...
- CSS3新增特性及知识学习线路
- react-eslintrc
{ "extends": ["eslint:recommended"], "plugins": [ "react" ], ...
- 关于QList<T>的内存释放
当T为指针类型时,List.clear()不能释放其内存,需加上qDeleteAll()函数, //class Person ---> Person(int id_,QString name_) ...
- UE4动画及相关物理的更新顺序图
- 网络操作系统 第六章 Window Server 2008 活动目录
本章小结 在企业网络中,活动目录是必不可少的,它将网络中各种对象组织起来进行管理,方便了网络对象的查找,增强了网络的安全性,为用户的物流管理提供了极大的便利,本章首先介绍了活动目录的基本概念,然后通过 ...
- AngularJS 关于ng-model和ng-bind还有{{}}
What's the difference between ng-model and ng-bind ng-bind has one-way data binding ($scope --> v ...