android cache缓存,Android缓存Cache学习
Android缓存Cache学习
java
项目中须要用到缓存,我使用的是文件缓存,这里简单总结下:android
主要思路是封装一个缓存对象,将每一个界面须要缓存的数据做为缓存对象的属性,将缓存对象以PageCache缓存到文件。缓存
缓存对象类:网络
//封装缓存数据对象
public class PageCache implements Serializable {
private static final long serialVersionUID = 3405510521707227897L;
public static final String PAGE_KEY = "page.key";
// 缓存数据是集合
private List benqunList;
public List getBenqunList() {
return benqunList;
}
public void setBenqunList(List benqunList) {
this.benqunList = benqunList;
}
缓存工具类:
public class DataFileCache {
public static String FUJIN_CACHE_NAME = "A"; // 附近的人缓存目录
public static String BENQUN_CACHE_NAME = "B"; // 社群缓存目录
public static String BENYOU_CACHE_NAME = "C"; // 好友数据缓存目录
public static String USER_CACHE_NAME = "D"; // 我的页面缓存
public static final String CACHDIR = File.separator + "benben"
+ File.separator + "cache" + File.separator;// 缓存根目录
private static final String Suffix = ".benben";// 缓存文件后缀名
private static final int FREE_SD_SPACE_NEEDED_TO_CACHE = 1;// 缓存空间大于1M才能进行缓存
private int MB = 1024 * 1024;
private String folder = "";
public static final String Favorit_CACHE_NAME = "Favorit";
public static final String LOG_CACHE_NAME = "Log"; // 日志文件目录
public static final int Favorit_Key = 0x100;
public static final String Category_CACHE_NAME = "Category";
public static final int Category_Key = 0x101;//
private Context mContext;
/**
* @param folder
* 缓存目录文件夹
* */
public DataFileCache(Context context, String folder) {
this.folder = folder;
this.mContext = context;
}
/**
* 缓存数据
*
* @param name
* 缓存文件名
* @param o
* 须要缓存的对象
* */
public boolean saveFile(String name, Object o) {
// 判断sdcard上的空间
if (FREE_SD_SPACE_NEEDED_TO_CACHE > freeSpaceOnSd()) {
// SD空间不足
return false;
}
String value = BaseHelper.object2String(o);
String filename = convertUrlToFileName(name);
String dir = getDirectory();
File file = new File(dir + File.separator + filename);
OutputStream outStream = null;
try {
if (file.exists()) {
file.delete();
}
file.createNewFile();
outStream = new FileOutputStream(file);
outStream.write(value.getBytes());
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (outStream != null) {
try {
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 保存日志文件
*
* @param name
* @param obj
*/
public void saveLogFile(String name, String obj) {
// 判断sdcard上的空间
if (FREE_SD_SPACE_NEEDED_TO_CACHE > freeSpaceOnSd()) {
// SD空间不足
return;
}
String filename = convertUrlToFileName(name);
String dir = getDirectory();
FileWriter fileWriter;
try {
fileWriter = new FileWriter(dir + File.separator + filename, true);
fileWriter.write(obj);
fileWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 判断文件日志文件
*
* @param name
* @return
*/
public boolean isExist(String name) {
final String path = getDirectory() + File.separator
+ convertUrlToFileName(name);
File file = new File(path);
return file.exists();
}
/**
* 读取缓存文件,并返回数据
*
* @param name
* 缓存文件名
* */
public Object openFile(String name) {
Object o = null;
final String path = getDirectory() + File.separator
+ convertUrlToFileName(name);
File file = new File(path);
if (file.exists()) {
try {
FileInputStream inputStream = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(
inputStream));
StringBuilder sb = new StringBuilder("");
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
}
String value = sb.toString();
if (!"".equals(value)) {
byte[] bytes = Base64.decode(value);
ByteArrayInputStream navBais = new ByteArrayInputStream(
bytes);
ObjectInputStream navOis = new ObjectInputStream(navBais);
o = (Object) navOis.readObject();
navBais.close();
navOis.close();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
return o;
}
/**
* 清空缓存目录下的文件
* */
public boolean clear() {
File dir = new File(getDirectory());
File[] files = dir.listFiles();
if (files == null) {
return true;
}
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return false;
}
for (int i = 0; i < files.length; i++) {
files[i].delete();
}
dir.delete();
return true;
}
/**
* 清空商品分类缓存文件
* */
public boolean clearCategory() {
final String path = getDirectory();
File dir = new File(path);
try {
File[] files = dir.listFiles();
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return false;
}
for (int i = 0; i < files.length; i++) {
files[i].delete();
}
dir.delete();
} catch (Exception e) {
// TODO: handle exception
return false;
}
return true;
}
/**
* 计算sdcard上的剩余空间
*
* @return
*/
private int freeSpaceOnSd() {
StatFs stat = new StatFs(Environment.getExternalStorageDirectory()
.getPath());
double sdFreeMB = ((double) stat.getAvailableBlocks() * (double) stat
.getBlockSize()) / MB;
return (int) sdFreeMB;
}
/**
* 转成统一的文件名
* */
private String convertUrlToFileName(String fileName) {
return BaseHelper.delSignBlank(fileName) + Suffix;
}
/**
* 得到缓存目录 根据用户id获取当前用户的缓存目录 不一样用户缓存目录是不一样的
* */
private String getDirectory() {
String dir = "";
LoginBean loginBean = SharedPreferencesUtils.getObject(mContext,
Preferences.LOGIN_RESPONSE, LoginBean.class);// 获取当前登陆用户id
if (loginBean != null && loginBean.getPersonId() != null) {
// 缓存路径,SD卡+缓存文件名+当前用户+缓存内容的文件名
dir = getSDPath() + CACHDIR + loginBean.getPersonId()
+ File.separator + folder;
} else {
dir = getSDPath() + CACHDIR + "default" + File.separator + folder;
}
try {
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();
}
} catch (Exception e) {
e.printStackTrace();
}
return dir;
}
/**
* 取SD卡路径不带/
* */
private String getSDPath() {
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
if (sdCardExist) {
sdDir = Environment.getExternalStorageDirectory();// 获取跟目录
}
if (sdDir != null) {
return sdDir.toString();
} else {
return "";
}
}
public boolean saveTxt(String name, String value) {
// 判断sdcard上的空间
if (FREE_SD_SPACE_NEEDED_TO_CACHE > freeSpaceOnSd()) {
// SD空间不足
return false;
}
String filename = name + ".txt";
String dir = getDirectory();
File file = new File(dir + File.separator + filename);
OutputStream outStream = null;
try {
if (file.exists()) {
file.delete();
}
file.createNewFile();
outStream = new FileOutputStream(file);
outStream.write(value.getBytes());
return true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outStream != null) {
try {
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
/**
* 读取缓存文件,并返回数据
*
* @param name
* 读取缓存文件的文件名
* */
public String openTxt(String name) {
final String path = getDirectory() + File.separator + name + ".txt";
File file = new File(path);
if (file.exists()) {
try {
FileInputStream inputStream = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(
inputStream));
StringBuilder sb = new StringBuilder("");
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
}
String value = sb.toString();
return value;
} catch (Exception e) {
e.printStackTrace();
}
}
return "";
}
}
Activity调用:
//缓存文件名,这里使用类名app
private final static String TAG = ShequFragment.class.getSimpleName();工具
1,实例化缓存工具类学习
DataFileCache dataFileCache = new DataFileCache(getActivity(),
DataFileCache.BENQUN_CACHE_NAME);
2,获取数据后缓存ui
// 缓存
PageCache page = new PageCache ();page.setBenqunList(allata);dataFileCache.saveFile(TAG, page);
3,获取缓存数据
//获取缓存数据
Object obj = dataFileCache.openFile(TAG);
if (obj != null) {
PageCache page = (PageCache) obj;
allata = page.getBenqunList();
mAdapter.addList(allata);
mAdapter.notifyDataSetChanged();
} else {
//缓存没有数据,网络获取
getAllBBSClassList(true);
}
android cache缓存,Android缓存Cache学习相关推荐
- android 缓存文件目录在哪个文件夹里,Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目录 | 用户可见目录...
先简要介绍一下Android系统的文件系统吧,本文基于原生Android M系统: 我们都知道Android系统内核就是个Linux.所以我们的文件系统与Linux也是基本一致的,最顶部的目录是 &q ...
- android 根目录缓存,Android系统中内部存储和外部存储(公有目录、私有目录、缓存目录)详解...
首先,明确一个概念,Android内部存储和外部存储并非所谓的手机自带内存是内部存储,SD卡是外部存储云云. Android对内部存储和外部存储不是在物理上区分的,而是在逻辑上区分的.git 1.概念 ...
- Android之DiskLruCache(缓存工具)
DiskLruCache DiskLruCache是一个十分好用的android缓存工具,我们可以从GitHub上下载其源码:https://github.com/JakeWharton/DiskLr ...
- Android之Bitmap高效缓存以及android缓存策略
Android之Bitmap高效缓存 一.Bitmap高效加载 1.bitmap的基本概念 位图:获取像素值进行加载. Bitmap是Android系统中图像处理中的最重要的一个类. 通过Bitmap ...
- android 清理缓存 简书,分享:Android清除本地数据缓存代码
/**文 件 名:DataCleanManager.java*描述:主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录*/ importjava ...
- Android应用程序文件缓存getCacheDir()和getExternalCacheDir()
如果Android引用程序需要缓存临时文件,系统提供了一个可管理的"内部缓存"和一个不可管理的"外部缓存",分别调用getCacheDir()和getExter ...
- Android清除本地数据缓存代码
Android清除本地数据缓存代码案例 直接上代码: /* * 文 件 名: DataCleanManager.java * 描 述: 主要功能有清除内/外缓存,清除数据库,清除sharedPrefe ...
- android 根目录缓存,Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目录 | 用户可见目录...
先简要介绍一下Android系统的文件系统吧,本文基于原生Android M系统: 我们都知道Android系统内核就是个Linux.所以我们的文件系统与Linux也是基本一致的,最顶部的目录是 &q ...
- android h5 离线缓存,H5 应用程序缓存(离线缓存)
离线缓存这个功能的实现有以下步骤: 1,以nginx做web服务器为例,在mime.types文件中添加一行:text/cache-manifest manifest,作用是为了让服务器识别该 ...
最新文章
- react --- 搭建环境
- 舞力全开加速_国行舞力全开评测:丝滑得不像是育碧服务器!
- hybris impex里的多语言处理语法
- java 日志乱码_【开发者成长】JAVA 线上故障排查完整套路!
- 基于VMware Workstation创建虚拟机,以Ubuntu16.04为例
- mysql 5.7.17 x86_Windows(x86,64bit)升级MySQL 5.7.17免安装版的详细教程
- Interlocked原子访问系列函数
- Android 应用开发(38)TableLayout(表格布局)
- python实现屏幕录制_GitHub - Sijiu/record-camera-and-screen: 录制摄像头和录制屏幕,两者之间可以轻易切换...
- 整理一下自动生成代码的软件
- 微软苏州校招笔试 12月27日 By Java
- Unity初级案例-愤怒的小鸟:六:17把粒子系统显示在UI之前+18让星星一颗一颗的显示+19添加暂停动画
- Android框架——下载图片框架Fresco
- 当你看不清自己的时候,读一些句子会有启发
- [知乎]关于WindowsXPx64SP2系统的说明
- 如何测试光盘的质量?
- 傻瓜攻略(九)——MATLAB实现简单的多元线性回归(以炼钢转炉炉龄问题为例)
- opencv打开图片转换为二进制
- 那些年,我们曾白嫖到的图床
- yolov5运行以及训练时报错的问题