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学习相关推荐

  1. android 缓存文件目录在哪个文件夹里,Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目录 | 用户可见目录...

    先简要介绍一下Android系统的文件系统吧,本文基于原生Android M系统: 我们都知道Android系统内核就是个Linux.所以我们的文件系统与Linux也是基本一致的,最顶部的目录是 &q ...

  2. android 根目录缓存,Android系统中内部存储和外部存储(公有目录、私有目录、缓存目录)详解...

    首先,明确一个概念,Android内部存储和外部存储并非所谓的手机自带内存是内部存储,SD卡是外部存储云云. Android对内部存储和外部存储不是在物理上区分的,而是在逻辑上区分的.git 1.概念 ...

  3. Android之DiskLruCache(缓存工具)

    DiskLruCache DiskLruCache是一个十分好用的android缓存工具,我们可以从GitHub上下载其源码:https://github.com/JakeWharton/DiskLr ...

  4. Android之Bitmap高效缓存以及android缓存策略

    Android之Bitmap高效缓存 一.Bitmap高效加载 1.bitmap的基本概念 位图:获取像素值进行加载. Bitmap是Android系统中图像处理中的最重要的一个类. 通过Bitmap ...

  5. android 清理缓存 简书,分享:Android清除本地数据缓存代码

    /**文 件 名:DataCleanManager.java*描述:主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录*/ importjava ...

  6. Android应用程序文件缓存getCacheDir()和getExternalCacheDir()

    如果Android引用程序需要缓存临时文件,系统提供了一个可管理的"内部缓存"和一个不可管理的"外部缓存",分别调用getCacheDir()和getExter ...

  7. Android清除本地数据缓存代码

    Android清除本地数据缓存代码案例 直接上代码: /* * 文 件 名: DataCleanManager.java * 描 述: 主要功能有清除内/外缓存,清除数据库,清除sharedPrefe ...

  8. android 根目录缓存,Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目录 | 用户可见目录...

    先简要介绍一下Android系统的文件系统吧,本文基于原生Android M系统: 我们都知道Android系统内核就是个Linux.所以我们的文件系统与Linux也是基本一致的,最顶部的目录是 &q ...

  9. android h5 离线缓存,H5 应用程序缓存(离线缓存)

    离线缓存这个功能的实现有以下步骤: 1,以nginx做web服务器为例,在mime.types文件中添加一行:text/cache-manifest     manifest,作用是为了让服务器识别该 ...

最新文章

  1. react --- 搭建环境
  2. 舞力全开加速_国行舞力全开评测:丝滑得不像是育碧服务器!
  3. hybris impex里的多语言处理语法
  4. java 日志乱码_【开发者成长】JAVA 线上故障排查完整套路!
  5. 基于VMware Workstation创建虚拟机,以Ubuntu16.04为例
  6. mysql 5.7.17 x86_Windows(x86,64bit)升级MySQL 5.7.17免安装版的详细教程
  7. Interlocked原子访问系列函数
  8. Android 应用开发(38)TableLayout(表格布局)
  9. python实现屏幕录制_GitHub - Sijiu/record-camera-and-screen: 录制摄像头和录制屏幕,两者之间可以轻易切换...
  10. 整理一下自动生成代码的软件
  11. 微软苏州校招笔试 12月27日 By Java
  12. Unity初级案例-愤怒的小鸟:六:17把粒子系统显示在UI之前+18让星星一颗一颗的显示+19添加暂停动画
  13. Android框架——下载图片框架Fresco
  14. 当你看不清自己的时候,读一些句子会有启发
  15. [知乎]关于WindowsXPx64SP2系统的说明
  16. 如何测试光盘的质量?
  17. 傻瓜攻略(九)——MATLAB实现简单的多元线性回归(以炼钢转炉炉龄问题为例)
  18. opencv打开图片转换为二进制
  19. 那些年,我们曾白嫖到的图床
  20. yolov5运行以及训练时报错的问题

热门文章

  1. APB简介及verilog代码示例
  2. Linux下的软件安装
  3. 定期清理window事件日志
  4. 操纵稳定性数据处理matlab,基于Matlab汽车操纵稳定性仿真方法的研究
  5. 学python的亲身经历_你要偷偷的学Python,然后惊呆所有人
  6. 彭兰 新媒体进阶研究
  7. 运动助手卡密增加了,周卡来领取!
  8. 【5天Python】
  9. SQL sever数据库的单表查询和连接查询
  10. 终于有人把Web 3.0和元宇宙讲明白了