在Android上为APP虚拟出定时的内存缓存
来源:互联网 发布:python def函数用法 编辑:程序博客网 时间:2024/05/16 04:09
在项目开发中有一个需求,每次启动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);}}}
0 0
- 在Android上为APP虚拟出定时的内存缓存
- 经验总结---编译出可以在Android上执行的可执行文件
- 在虚拟上(VMware)安装Android X86
- android:largeHeap为APP申请更多内存
- 使用genymotion在virtualBox上不能为虚拟xx打开一个新任务的解决方案
- 如何优化Html5 App 在IOS/Android 上的性能
- web app 通过cordova在模拟的Android平台上
- opensuse在虚拟上的安装过程
- 关于wince在kvm上的虚拟
- Android——内存篇:清除当前app缓存
- 为app申请更大的内存
- Android管理App的内存
- 管理Android APP的内存
- android在代码中为new出的控件设置ID及setId()异常
- AppCan:如何在Android手机上开发出Android应用
- AppCan:如何在Android手机上开发出Android应用
- AppCan:如何在Android手机上开发出Android应用
- 在android上实施不会OOM的内存管理方案
- webStorm快捷键和Window7快捷键
- VS2012中禁用JetBrains ReSharper 8
- iOS 8 setSeparatorInset 表视图显示全部的分割线 去除空白行的分割线
- 谈谈支付宝的动态加载
- 基于openfire+smack的Android、消息推送服务
- 在Android上为APP虚拟出定时的内存缓存
- git 远程仓库管理
- 【Linux】Linux基础命令
- CephFS环境搭建(一)
- 【maven】—— pom.xml配置用法大全
- linux设备和驱动加载的先后顺序
- Java初始化顺序
- 从零开始学Xamarin.Forms(五) 技巧
- Java list转json串的问题