Android内存优化之磁盘缓存

Android内存优化之磁盘缓存

大家好,又见面了,我是全栈君。

前言:

上一篇文章中介绍了内存缓存,内存缓存的长处就是非常快。可是它又有缺点:

  • 空间小,内存缓存不可能非常大;
  • 内存紧张时可能被清除;
  • 在应用退出时就会消失,做不到离线。

基于以上的缺点有时候又须要第二种缓存,那就是磁盘缓存。大家应该都用过新闻client,非常多都有离线功能,功能的实现就是磁盘缓存。

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,编程技巧等相关文章等着您,我们还能够在线交流。

image010-258x250


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108572.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Vue项目实战05:18n实现多语言自动切换-浏览器语言设置「建议收藏」

    Vue项目实战05:18n实现多语言自动切换-浏览器语言设置「建议收藏」什么是vue-i18ni18n是Internationalization这个英文的简写,即国际化的意思,vue-i18n是一款针对于vue开发的国际化插件,让项目支持多语言切换,以适应不同地区用户的需求。安装vue-i18n直接在项目中执行安装命令:npminstallvue-i18n–save​全局引入vue-i18n在项目中引入vue-i18n,实例化vue-i18n将需要加载的语言包通过require导入,这里看个人需求我只需要中英日文,所以引入zh-CN.js和en-US.j

    2022年6月4日
    37
  • python中二维列表取值_python二维元组元素的提取

    python中二维列表取值_python二维元组元素的提取直接切片是不行的:>>>a=[[1,2,3],[4,5,6]]>>>a[:,0]#尝试用数组的方法读取一列失败TypeError:listindicesmustbeintegersorslices,nottuple我们可以直接构造:>>>b=[i[0]…

    2025年7月1日
    7
  • @RequestParam和@PathVariable的用法与区别

    @RequestParam和@PathVariable的用法与区别SpringBoot——@PathVariableURL变量Web应用中的URL通常不是一成不变的,例如微博两个不同用户的个人主页对应两个不同的URL:http://weibo.com/user1和http://weibo.com/user2。我们不能对于每一个用户都编写一个被@RequestMapping注解的方法来处理其请求,也就是说,对于相同模式的URL(例如不同用户的主页,他们…

    2022年6月28日
    23
  • kettle下载安装使用教程

    kettle下载安装使用教程Kettle简介Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行, 数据抽取高效稳定。Kettle中文名称叫水壶,该项目的主程序员MATT希望把各种数据放到一个壶里,然后以一种指定的格式流出。Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。Kettle中有两…

    2022年5月24日
    31
  • iPhone手机屏幕分辨率(苹果手机最大的屏幕尺寸)

    第一代iPhone2G屏幕为3.5英吋,分辨率为320*480像素,比例为3:2。第二代iPhone3G屏幕为3.5英吋,分辨率为320*480像素,比例为3:2。第三代iPhone3GS屏幕为3.5英吋,分辨率为320*480像素,比例为3:2。第四代iPhone4屏幕为3.5英吋,分辨率为960*640像素,比例为3:2,比之前三代像素增加,但屏幕比例没变化。第五代iPhone…

    2022年4月13日
    779
  • 神奇的罗斯.布朗_罗曼·格罗斯让

    神奇的罗斯.布朗_罗曼·格罗斯让这是一篇赞美罗斯.布朗和他的车队布朗GP的文章未完,抽时间写作中……转载于:https://www.cnblogs.com/yuuhhe/archive/2009/03/30/1425074.html

    2022年9月30日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号