设为首页 加入收藏

TOP

Android内存优化之磁盘缓存
2015-07-16 12:55:10 来源: 作者: 【 】 浏览:2
Tags:Android 内存 优化 磁盘

前言:


基于以上的缺点有时候又需要另外一种缓存,那就是磁盘缓存。大家应该都用过新闻客户端,很多都有离线功能,功能的实现就是磁盘缓存。


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;
}


总结:以上是磁盘缓存的创建和使用方法。在实际操作中内存缓存和磁盘缓存是配合起来使用的,一般先从内存缓存中读取数据,如果没有再从磁盘缓存中读取。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android内存优化之内存缓存 下一篇Android主线程的消息系统(Handler..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: