Android内存优化之磁盘缓存
来源:互联网 发布:上海公交车软件 编辑:程序博客网 时间:2024/06/09 23:06
前言:
在上一篇文章中介绍了内存缓存,内存缓存的优点就是很快,但是它又有缺点:
- 空间小,内存缓存不可能很大;
- 内存紧张时可能被清除;
- 在应用退出时就会消失,做不到离线;
基于以上的缺点有时候又需要另外一种缓存,那就是磁盘缓存。大家应该都用过新闻客户端,很多都有离线功能,功能的实现就是磁盘缓存。
DiskLruCache:
在Android中用到的磁盘缓存大多都是基于DiskLruCache实现的,具体怎么使用呢?
- 创建一个磁盘缓存对象:
public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize);open()方法接收四个参数,第一个参数是数据的缓存文件地址,第二个参数是当前应用程序的版本号,第三个参数是同一个key可以对应多少个缓存文件,一般都是传1,第四个参数是最多可以缓存多少字节的数据,10M?
- 获取缓存路径:
// Creates a unique subdirectory of the designated app cache directory. Tries to use external// but if not mounted, falls back on internal storage.//创建磁盘缓存文件,首选sdcard,如果sdcard没有挂载或者没有sdcard则获取应用默认的cache目录public static File getDiskCacheDir(Context context, String uniqueName) { // Check if media is mounted or storage is built-in, if so, try and use external cache dir // otherwise use internal cache dir final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !isExternalStorageRemovable() ? getExternalCacheDir(context).getPath() : context.getCacheDir().getPath(); return new File(cachePath + File.separator + uniqueName);}
- 获取软件版本号:
public int getAppVersion(Context context) {try {PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);return packageInfo.versionCode;} catch (NameNotFoundException e) {e.printStackTrace();}return 1;}
- 完整的代码如下:
DiskLruCache mDiskLruCache = null;try {File cacheDir = getDiskCacheDir(context, "thumbnails");if (!cacheDir.exists()) {cacheDir.mkdirs();}mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024);} catch (IOException e) {e.printStackTrace();}
- 具体怎么使用上面创建的磁盘缓存如下:
//添加缓存public void addBitmapToCache(String key, Bitmap bitmap) { // Add to memory cache as before,把缓存放到内存缓存中 if (getBitmapFromMemCache(key) == null) { mMemoryCache.put(key, bitmap); } // Also add to disk cache,把缓存放入磁盘缓存 synchronized (mDiskCacheLock) { if (mDiskLruCache != null && mDiskLruCache.get(key) == null) { mDiskLruCache.put(key, bitmap); } }}//获取缓存public Bitmap getBitmapFromDiskCache(String key) { synchronized (mDiskCacheLock) { // Wait while disk cache is started from background thread while (mDiskCacheStarting) { try { mDiskCacheLock.wait(); } catch (InterruptedException e) {} } if (mDiskLruCache != null) { return mDiskLruCache.get(key); } } return null;}
总结:
以上是磁盘缓存的创建和使用方法。在实际操作中内存缓存和磁盘缓存是配合起来使用的,一般先从内存缓存中读取数据,如果没有再从磁盘缓存中读取。个人水平有限,有什么问题可以留言,最好是添加我的公众号:coder_online,我能及时的看到你的留言并给你答复。
想第一时间获得更多原创文章,请关注个人微信公众平台:程序员互动联盟(coder_online),扫一扫下方二维码或者搜索微信号coder_online即可关注,里面有大量Android,Chromium,Linux,编程技巧等相关文章等着您,我们还可以在线交流。
0 0
- Android内存优化之磁盘缓存
- Android之ListView异步加载网络图片(优化缓存机制)和对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- Bitmaps与优化|磁盘缓存|内存缓存|双缓存
- 内存缓存+磁盘缓存
- Android缓存机制Lrucache内存缓存和DiskLruCache磁盘缓存
- android网络相册(带磁盘缓存DiskLruCache 和内存缓存LruCache)
- Android内存缓存和磁盘缓存的实现
- ORACLE数据库性能优化之-->内存磁盘
- Banner 内存 磁盘 缓存
- SDWebImage内存缓存 磁盘缓存
- Android项目之ImageLoader_磁盘缓存
- Android项目之ImageLoader_获取磁盘缓存
- 64位开源处理器Rocket的源代码简单介绍
- Android体验高扩展艺术般的适配器
- 【Linux】系统数据文件和信息
- oracle dg 维护常用操作和调优
- How to install Maven on Mac OS X Mavericks (10.9)
- Android内存优化之磁盘缓存
- vmware安装centos以及实现win7和centos自由拖放文件
- unity3D游戏开发之雾效、水效和音效
- Tomcat server.xml参数详解
- display:inline-block引发的间隙思考
- EHCache简单使用
- 图像、片、帧、NALU学习H.264
- gre填空核心词汇
- rcc不是内部或外部命令