android对象缓存,Android简单实现 缓存数据

前言

1、每一种要缓存的数据都是有对应的versionCode,通过versionCode请求网络获取是否需要更新

2、提前将要缓存的数据放入assets文件夹中,打包上线。

缓存设计

6b01a1dcb26662ccdd0223b83c644aaa.png

代码实现

/**

* Created by huangbo on 2017/6/19.

*

* 主要是缓存的工具类

*

* 缓存设计:

* 0.从内存中读取数据 :0.1 读取成功-> 取出versionCode ->3

* 0.2 读取失败-> 1

*

* 1.从文件中读取数据:1.1读取成成功-> 取出versionCode ->3

* 1.2读取失败-> 2

* 2.从Assets中读取数据:2.1读取成功-> 取出versionCode ->3

* 2.2读取失败-> versionCode==0 ->3

*

* 3.用versionCode请求网络 3.1请求成功(有版本更新)将文件写入内存,写入文件;

* 3.1 请求失败,(没有版本更新)

*

*/

public class CacheData {

public static CacheData cacheData;

public static CacheData getInstance() {

if (cacheData == null) {

cacheData = new CacheData();

}

return cacheData;

}

String mFileName;

public CacheData cacheName(String mFileName) {

this.mFileName = mFileName;

return this;

}

ExecutorService cachedThreadPool;

private CacheData() {

cachedThreadPool = Executors.newCachedThreadPool();

}

/**

* 从assets 中读取文件

*

* @return cacheData 的Json串

*/

private String readDataFromAssets() {

try {

InputStream ips = AppUtils.ApplicationContext.getAssets().open(mFileName);

byte[] bytes = new byte[ips.available()];

ips.read(bytes);

ips.close();

return new String(bytes);

} catch (IOException e) {

e.printStackTrace();

}

return "";

}

public void readDataFromAssets(final Handler handler) {

cachedThreadPool.execute(new Runnable() {

@Override

public void run() {

String json = readDataFromAssets();

Message message = handler.obtainMessage(1, json);

handler.sendMessage(message);

}

});

}

public void readDataFromFile(final Handler handler) {

cachedThreadPool.execute(new Runnable() {

@Override

public void run() {

Message message = handler.obtainMessage(1, readDataFromFile());

handler.sendMessage(message);

}

});

}

/**

* 将region 更新到指定文件里

* @param

*/

public void writeData2FileWithThread(final String Data) {

cachedThreadPool.execute(new Runnable() {

@Override

public void run() {

writeRegion2File(Data);

}

});

}

/**

* @return cacheData 的Json串

*/

private String readDataFromFile() {

try {

File file = new File(AppUtils.getCacheDirectory(), mFileName);

if (!file.exists()) {

return null;

}

FileInputStream fis = new FileInputStream(file);

byte[] bytes = new byte[fis.available()];

fis.read(bytes);

fis.close();

return new String(bytes);

} catch (IOException e) {

e.printStackTrace();

}

return "";

}

private void writeData2File(String jsonData) {

try {

File cityFile = new File(AppUtils.getCacheDirectory(), mFileName);

if (!cityFile.exists()) {

cityFile.createNewFile();

}

FileOutputStream fos = new FileOutputStream(cityFile);

fos.write(regionJsonData.getBytes("UTF-8"));

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

使用方法

/**

* Created by huangbo on 2017/6/8.

*/

public class Region {

public static Region region;

public static Region getInstance() {

if (region == null) {

region = new Region();

}

return region;

}

ProvinceCityBean provinceCityBean;

public int getVersion() {

return provinceCityBean == null ? 0 : provinceCityBean.getVersion();

}

public ProvinceCityBean getProvinceCityBean() {

return provinceCityBean;

}

public void setProvinceCityBean(final String mRegionJson, final Handler handler) {

if (TextUtils.isEmpty(mRegionJson)) {

return;

}

cachedThreadPool.execute(new Runnable() {

@Override

public void run() {

provinceCityBean = GsonUtils.GsonToBean(mRegionJson, ProvinceCityBean.class);

if (handler != null) {

handler.sendEmptyMessage(1);

}

}

});

}

ExecutorService cachedThreadPool;

CacheData cacheData;

private Region() {

cachedThreadPool = Executors.newCachedThreadPool();

cacheData = CacheData.getInstance().cacheName(Const.REGION_JSON);

}

/**

* 具体调用方法

*/

public void cacheRegion() {

if (provinceCityBean == null) {

readRegionFromFile();

} else {

readRegionFromHttp();

}

}

private void readRegionFromFile() {

cacheData.readDataFromFile(new Handler() {

@Override

public void handleMessage(Message msg) {

String jsonRegion = (String) msg.obj;

onReadRegionFromFileBack(jsonRegion);

}

});

}

/**

* 从文件中读取数据,若为null 继续从Asset中获取

*

* @param jsonRegion

*/

private void onReadRegionFromFileBack(String jsonRegion) {

if (!TextUtils.isEmpty(jsonRegion)) {/*文件中读取成功 设置到Region中更新json 取出version请求网络判断是否为最新的版本 */

setProvinceCityBean(jsonRegion, httpHandler);

} else {/*文件中读取失败 从assets 中继续读取*/

cacheData.readDataFromAssets(new Handler() {

@Override

public void handleMessage(Message msg) {

String jsonRegion = (String) msg.obj;

onReadRegionFromAssetsBack(jsonRegion);

}

});

}

}

private void onReadRegionFromAssetsBack(String jsonRegion) {

if (!TextUtils.isEmpty(jsonRegion)) {/*从assets中读取成功 设置到Region中更新json*/

setProvinceCityBean(jsonRegion, httpHandler);

} else {

readRegionFromHttp();

}

}

private void readRegionFromHttp() {

ReqRegion reqRegion = new ReqRegion();

reqRegion.sendRequest(false, new OnHttpResult() {

@Override

public void onHttpSuccess(String data) {

setProvinceCityBean(data, null);

cacheData.writeData2FileWithThread(data);

}

@Override

public void onHttpFailure(String message) {

}

});

}

Handler httpHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

readRegionFromHttp();

}

};

}

Region.getInstance().cacheRegion();//实现缓存

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通信原理.绪论

今天刚上通信原理的第一节课,没有涉及过多的讲解,只是讲了下大概的知识框架。现记录如下: 目录1、基本概念消息、信息与信号2、通信系统模型1、信息源2、发送设备3、信道4、接收设备5、信宿6、模拟通信系统模型7、数字通信系统模型8、信源编…

css rgba透明_rgba()函数以及CSS中的示例

css rgba透明Introduction: 介绍: Functions are used regularly while we are developing a web page or website. Therefore, to be a good developer you need to master as many functions as you can. This way your coding knowledge will increase as well …

犀牛脚本:仿迅雷的增强批量下载

迅雷的批量下载满好用。但是有两点我不太中意。在这个脚本里会有所增强 1、不能设置保存的文件名。2、不能单独设置这批下载的线程限制。 使用方法 // 下载从编号001到编号020的图片,保存名为猫咪写真*.jpg 使用6个线程 jdlp http://bizhi.zhuoku.com/bizhi/200804/…

android 服务端 漏洞,安卓漏洞 CVE 2017-13287 复现详解-

2018年4月,Android安全公告公布了CVE-2017-13287漏洞。与同期披露的其他漏洞一起,同属于框架中Parcelable对象的写入(序列化)与读出(反序列化)的不一致所造成的漏洞。在刚看到谷歌对于漏洞给出的补丁时一头雾水,在这里要感谢heeeeenMS509Team…

GAP(全局平均池化层)操作

转载的文章链接: 为什么使用全局平均池化层? 关于 global average pooling https://blog.csdn.net/qq_23304241/article/details/80292859 在卷积神经网络的初期,卷积层通过池化层(一般是 最大池化)后总是要一个或n个全…

zoj1245 Triangles(DP)

/* 动态三角形&#xff1a;每次DP时考虑的是两个子三角形的高度即可 注意&#xff1a; 三角形可以是倒置的。 */ View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <stdio.h> 5 6 using namespace std; 7 8…

android编程从零开始,从零开始学习android开发

博主最近开通了Android栏目&#xff0c;现在正在从零开始学习android&#xff0c;遇到的所有值得分享的知识点以及遇到的问题将发布在这个博客的android栏目下。因为我有着深厚的java底子&#xff0c;所以学习起来得心应手&#xff0c;十分的简单&#xff0c;当然也只能算是入门…

CNN基本步骤以及经典卷积(LeNet、AlexNet、VGGNet、InceptionNet 和 ResNet)网络讲解以及tensorflow代码实现

课程来源&#xff1a;人工智能实践:Tensorflow笔记2 文章目录前言1、卷积神经网络的基本步骤1、卷积神经网络计算convolution2、感受野以及卷积核的选取3、全零填充Padding4、tf描述卷积层5、批标准化(BN操作)6、池化Pooling7、舍弃Dropout8、卷积神经网络搭建以及参数分析2、经…

第十九章 趣味编程

第十九章 趣味编程 本章将介绍一些通用的Python编程指南。 为何要有趣 Python有趣的地方之一就是让用户的编程效率非常高效。 极限编程是一种软件开发方法 编程柔术 python的灵活性描述原型设计Python的优点之一是让你能够快速地编写程序。要更深入地了解面临的问题&#…

【数据结构基础笔记】【顺序表】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、创建顺序表2、顺序表插入元素3、顺序表删除元素4、顺序表实例分析1、静态2、动态5、顺序表总结前言 本章总结&#xff1a;从静态和动态分别进行顺序表的创建、插入、删除、以及实例分析 1、创建顺序表 1、静态地生成一张…

关于《加密与解密》的读后感----对dump脱壳的一点思考

偶然翻了一下手机日历&#xff0c;原来今天是夏至啊&#xff0c;时间过的真快。ISCC的比赛已经持续了2个多月了&#xff0c;我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦&#xff0c;但感觉还是很幸运的&#xff0c;能在大三的时候遇到ISCC&#xff0c;不管怎样&…

【数据结构基础笔记】【链表】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、链表基础2、创建一个链表3、插入结点4、删除结点5、销毁链表6、实例分析前言 本章总结&#xff1a;链表的定义、创建、销毁&#xff0c;结点的插入与删除 1、链表基础 链表的物理存储结构是用一组地址任意的存储单元存储…

视频图像质量评价

目录1、人眼视觉特性1、眼的适应性2、对比灵敏度3、空间分辨率和时间分辨率4、马赫效应5、可见度阈值2、图像质量测度3、图像评价方法4、图像评价方法的优劣1、人眼视觉特性 1、眼的适应性 暗适应性&#xff1a;从亮环境到暗环境&#xff0c;适应暗环境的特性 亮适应性&#…

recovery编译问题汇总

1、修改支持USB大容量存储 &#xff08;1&#xff09;、首先需要查看手机lun位置 手机链接电脑&#xff0c;打开cmd命令行&#xff0c;依次输入以下命令: adb shell find /sys -name "lun" 输出以下结果&#xff1a; 发现手机输出结果有两个&#xff0c;需要进一步查…

【数据结构基础笔记】【栈】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、栈的定义2、创建一个栈3、入栈和出栈操作4、栈的清空、销毁、计算栈的当前容量5、实例分析前言 本章总结&#xff1a;栈的定义、创建栈&#xff0c;销毁栈&#xff0c;入栈出栈操作等操作。 1、栈的定义 栈是一种重要的…

用HTML语言制作list标记,html5 datalist标签的用法是什么?这里有datalist标签的用法实例...

本篇文章主要为大家讲述了关于html5 datalist标签的用法及html5 datalist标签的用法实例。本文说了两个常用的选项框的实例供大家选择观看&#xff0c;下面就让我们一起来看这篇文章吧我们先来看看html5 datalist标签的用法&#xff1a;标签定义选项列表。请与input元素配合使用…

【数据结构基础笔记】【队列】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、队列定义2、创建一个队列3、入队列4、出队列5、销毁一个队列6、循环队列的概念7、循环队列的实现8、实例分析前言 本章总结&#xff1a;链队列定义&#xff0c;创建&#xff0c;出队入队操作&#xff0c;销毁操作&#x…

html图片自动循环轮播图,js实现图片无缝循环轮播

本文实例为大家分享了js实现图片无缝循环轮播的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下代码如下Document#container{overflow:hidden;width:400px;height:300px;margin:auto;}#front,#container{display:flex;flex-direction:row;}#container img{width:400px…

五、json模块

一、json模块的介绍 json模块是Python自带的模块&#xff0c;用于json和Python数据之间的相互转换 Json与Python数据类型的对应关系 JsonPythonobjectdictarrayliststringstrnumber(int)int,longnumber(real)floattrueTruefalseFalsenullNone [#中括号括起来的&#xff0c;对…

【数据结构基础笔记】【树】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、树的概念2、二叉树3、二叉树的遍历4、创建二叉树5、实例分析前言 本章总结&#xff1a;树的概念、二叉树的创建、遍历 1、树的概念 树结构是以分支关系定义得一种层次结构。 树的定义&#xff1a;树是由n(n>0)个结点…