在Android上为APP虚拟出定时的内存缓存

在项目开发中有一个需求,每次启动APP的时候都需要向服务器请求参数,然后进入到某个界面时直接取出来,

而不去请求网络,实现更好的用户体验,但是这些数据只能保存一定时间,而且当APP关闭时,这些数据就得销毁,

查了半天API貌似没看到定时缓存(不确定到底有没有),这里就自己模拟了一个,注释已经很详细了。。。

看代码:

package com.memorycache;

import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;

import com.bxg.news.utils.DateUtils;

/**
 * 把一些数据缓存到内存,然后设置定时清理功能
 *
 * @author JiangYueSong
 *
 */
public class CacheContainer {

	/**
	 * 缓存的map
	 */
	private static Map<String, Object> cacheFile = new LinkedHashMap<String, Object>();
	/**
	 * 缓存只能占用的最大堆内存
	 */
	private static long limit = 1000000;
	/**
	 * 缓存已经使用的大小
	 */
	private static long usedCache = 0;

	/**
	 * 从缓存中取
	 *
	 * @param key
	 * @return
	 * @throws Exception
	 */
	synchronized public static Object getFromCacheFile(String key) {

		String tempkey = key + "DATE"; // 为缓存的数据添加过期时间
		Object obj = cacheFile.get(tempkey); // 获得数据
		if (obj == null) { // 判断是否为空
			return null;
		}

		Date d = new Date();
		int time = d.compareTo(DateUtils.strToDateLong(String.valueOf(obj))); // 把保存的时间与现在手机上的时间对比

		if (time >= 0) { // 如果超出,则删除
			removeValueByKey(key, tempkey);
			return null;
		} else {
			return cacheFile.get(key);
		}
	}

	/**
	 * 从缓存中移除数据
	 *
	 * @param key
	 */
	public static void removeValueByKey(String... key) {

		long start = 0;
		long end = 0;
		// 先垃圾回收
		System.gc();
		start = Runtime.getRuntime().freeMemory();
		for (int i = 0; i < key.length; i++) {
			if (cacheFile.containsKey(key[i]))
				cacheFile.remove(key[i]);
		}
		System.gc();
		end = Runtime.getRuntime().freeMemory();
		usedCache -= (end - start);
	}

	/**
	 * 保存数据岛map
	 *
	 * @param key
	 *            key
	 * @param obj
	 *            value
	 * @param holdTime
	 *            保存时间
	 */
	public static void saveValueByKey(String key, Object obj, int holdTime) {
		judgeContainer(); // 判断容器是否超出限制大小
		long start = 0;
		long end = 0;
		// 先垃圾回收
		System.gc();
		start = Runtime.getRuntime().freeMemory();
		String subKey = "";
		if (key.length() > 5) { // 由于为每一个key添加了一个key+DATE作为时间戳,所以这里判断是否存在这个时间戳
			subKey = key.substring(key.length() - 5);
		} else {
			subKey = key;
		}

		if (subKey.contains("DATE")) {
			if (cacheFile.containsKey(key)) {
				removeValueByKey(key);
				removeValueByKey(key.substring(0, key.length() - 4));
			}
		}
		cacheFile.put(
				key + "DATE",
				DateUtils.getPreTime(DateUtils.getStringDate(),
						String.valueOf(holdTime)));
		cacheFile.put(key, obj);

		System.gc();
		end = Runtime.getRuntime().freeMemory();
		usedCache += (end - start);
	}

	/**
	 * 判断容器大小是否超出内存
	 */
	synchronized public static void judgeContainer() {

		while (usedCache >= limit) {
			cacheFile.remove(cacheFile.size() - 1);
		}
	}

	/**
	 * 强制保存key value到map,如果之前存在则覆盖
	 *
	 * @param key
	 * @param obj
	 * @param holdTime
	 */
	synchronized public static void saveMap2CacheFile(String key, Object obj,
			int holdTime) {

		judgeContainer();
		// 首先放入时间的key给的key做关联
		saveValueByKey(key, obj, holdTime);

	}

	/**
	 * 放入缓存中,并判断是否存在,不使用
	 *
	 * @param file
	 * @param holdTime
	 * @return
	 */
	synchronized public static void putMap2CacheFile(String key, Object obj,
			int holdTime) {
		judgeContainer();

		saveValueByKey(key, obj, holdTime);
	}

	/**
	 * 放入缓存中,并判断是否存在,不使用
	 *
	 * @param file
	 * @param holdTime
	 * @return
	 */
	synchronized public static void putMap2CacheFile(Map<String, Object> file,
			int holdTime) {
		judgeContainer();
		for (String key : file.keySet()) {
			saveValueByKey(key, file.get(key), holdTime);

		}

	}
}
时间: 2024-10-31 18:37:42

在Android上为APP虚拟出定时的内存缓存的相关文章

Android ListView 图片异步加载和图片内存缓存

开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用户省流量,一般把加载完的图片先缓存下来,下次加载的时候就不需要再联网去服务器端加载.图片缓存一般分为一级缓存(即内存缓存)和二级缓存(即磁盘缓存).这里只讲一级缓存. 内存缓存就是把加载完的图片先放在手机内存中,等下次加载的时候再从内存中取出来. 优点是速度快,缺点是不能长久保存,用户退出应用程序之

Ionic在Android上部署app步骤

详情链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/ionic%E5%9C%A8android%E4%B8%8A%E9%83%A8%E7%BD%B2app%E6%AD%A5%E9%AA%A4/ 使用ionic建立了一个项目之后想要将它发布到各个应用商店,那么我们就要部署想要发布的版本,这段时间学习了Android的发布过程,下面我来介绍一下: 这个命令是我们在调试代码时候所需要的,一般下载模板的时候就有了,但是我们在发布版

Android 上能提高学习工作效率的应用

在知乎上有朋友问 Android 上能提高学习.工作效率的应用有哪些?我给他们的推荐获得了最多赞同.以后会不断完善更新此贴. Any.do :规划日程,各平台都有. Evernote:记笔记,各平台都有. OneNote:这个也不错,特别是文档功能很强大,微软有Office基因啊,但同步有点慢... Quora:问答SNS网站客户端 ,看问题学英语感觉不错 Pocket:稍候阅读软件,各平台都有,chrome有插件,自定义快捷键chrome上快速保存文章,Android上各App都可以分享到Pl

Android上的内存分配策略优化

在Android上,其实自身有一套完善的内存管理机制.但由于我们深受Windows和塞班的毒害,每当看到手机剩余内存只有30m时,就觉得非常不爽,总是希望通过一些工具清理一下内存,而当Toast显示已经为你清理500m内存时,就会产生无比的快感.比如管家的小火箭发射,就是利用了这种用户心理. 所以,那些内存清理工具在windows上是很有必要的,但在Android上,实属多此一举.至于进程的优先级以及memorykiller的管理机制,系统是通过oom_adj来进行管理,这个可以通过之前小管的一

Android Studio和MAT结合使用来分析内存问题

Android开发中时常会遇到内存泄漏的问题,而Android系统对单个App又有一定的内存限制,此值可以通过一下方式获取: ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); int memoryClass = am.getMemoryClass(); 上述代码中momeryClass的值可以当做每个App的内存限制.这个值根据不同的设备厂商都是不一样的,比如我的模拟器的值是32M,

Android内存优化之内存缓存

前言: 上面两篇博客已经讲了图片的基本知识和图片的加载方法及优化,所有的这些优化都是为了避免应用出现OOM这个问题.一个好的应用程序不仅要健壮不能出错还要方便用户使用,对于用户来说你的应用不仅要美观还要流畅,很快的呈现给他想要的.很快的加载图片除了加载的优化外还需要缓存,下面这篇博客将会讲图片缓存. 什么是缓存? 缓存技术原理就是把用户访问的所有对象看作一个全集,经过算法标记哪些是用户经常访问的对象,把这些对象放到一个集合里,这个集合是全集一个子集,下一次用户再访问的时候会先从这个子集集合中查找

Android之本地缓存——LruCache(内存缓存)与DiskLruCache(硬盘缓存)统一框架

本文参考郭霖大神的DiskLruCache解析,感兴趣的朋友可以先到http://blog.csdn.net/guolin_blog/article/details/28863651了解. 一.前言 该框架或者说库,主要是用于本地的图片缓存处理. 数据的存入 当你取到图片的元数据,会将数据存入硬盘缓存以及内存缓存中. 数据的获取 取数据的时候,先从内存缓存中取: 如果没有取到,则从硬盘缓存中取(此时如果硬盘缓存有数据,硬盘缓存会重新将数据写入内存缓存中): 如果硬盘缓存中没有取到,则从网上重新获

优化Recorder H5录音:可边录边转码上传服务器,支持微信提供Android IOS Hybrid App源码

目录 一.Recorder H5录音库的特性 (1)浏览器支持 (2)功能支持 二.使用预览截图 (1)移动端H5 (2)IOS Hybrid App (3)Android Hybrid App 三.应用场景 四.优化过程记录 (1)为什么要升级优化 (2)开始使用Web Worker加速转码 (3)剩下的问题 五.Hybrid App存在的意义 六.更多支持 Recorder H5 GitHub开源库随着支持功能的增多,音频转码处理效率渐渐的跟不上需求了,近期抽时间对音频转码部分进行了升级优化

Android Studio上Session &#39;app&#39;: Error Installing APK错误解决方案

我在使用Android Studio的时候,使用自己的魅族(M5 Note)真机调试,运行不成功,提示下面图片中的错误(Session 'app':Error Installing APK). 再经过测试过好几种网上的方法之后,特记录如下,望以后大家少走弯路,希望可以帮助到大家. 可能不同的人使用到的方法都会是下面的不同的方法: 1)连接手机之后,会有显示手机的SDK型号以及API的版本,显示我自己的是魅族M5 Note(Android 6,API23),在我的手机上安装不上,刚开始有人说魅族手