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、信源编…

Android版本演进中的兼容性问题

原文:http://android.eoe.cn/topic/summary Android 3.0 的主要变化包括: 不再使用硬件按键进行导航 (返回、菜单、搜索和主屏幕),而是采用虚拟按键 (返回,主屏幕和最近的应用)。在操作栏固定菜单。 Android 4.0 则把这些变化带到了手机平台。…

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 …

第十七章 扩展Python

第十七章 Python什么都能做,真的是这样。这门语言功能强大,但有时候速度有点慢。 鱼和熊掌兼得 本章讨论确实需要进一步提升速度的情形。在这种情况下,最佳的解决方案可能不是完全转向C语言(或其他中低级语言)&…

android studio资源二进制,无法自动检测ADB二进制文件 – Android Studio

我尝试在Android Studio上测试我的应用程序,但我遇到了困难"waiting for AVD to come online..."我读过Android设备监视器重置adb会做到这一点,它确实……对于1次测试,当我第二天重新启动电脑时,我不仅仅是:"waiting for AVD to come online..."…

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

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

为什么使用1 * 1 的卷积核

为什么使用 1* 1卷积核? 作用: 1、实现跨通道的交互和信息整合 2、 进行卷积核通道数的降维和升维 3、 在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性 跨通道的交互和信息整合 使用1 * 1卷积核&a…

KingPaper初探ThinkPHP3.1.2之扩展函数库和类库的使用(四)

在我们做项目的时候TP的系统函数或系统类库满足不了我们的需要 所以有些东西需要我们自己去定义,在TP中我们怎么使用自己的函数库和类库呢?在TP系统中提供了三个系统函数库 common.php是全局必须加载的基础函数库,在任何时候都可以直接调用&a…

isfinite函数_isfinite()函数以及C ++中的示例

isfinite函数C isfinite()函数 (C isfinite() function) isfinite() function is a library function of cmath header, it is used to check whether the given value is a finite value or not? It accepts a value (float, double or long double) and returns 1 if the v…

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

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

某公司面试题

一、基础题 1,冯诺依曼结构的计算机硬件逻辑组成中,不包含以下哪个模块? A,编译器 B,控制器 C,输入设备 D,输出设备 解释:冯诺依曼由五个模块组成:输入设备 输出设备 存…

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…

第十八章 程序打包

第十八章 程序打包 Setuptools和较旧的Distutils都是用于发布Python包的工具包&#xff0c;能够使用Python轻松地编写安装脚本。这些脚本可用于生成可发布的归档文档&#xff0c;供用户用来编译和安装编写库。 Setuptools并非只能用于创建基于脚本的Python安装程序&#xff0…

如何在Java中检查对象是否为空?

With the help of "" operator is useful for reference comparison and it compares two objects. 借助“ ”运算符&#xff0c;对于参考比较非常有用&#xff0c;它可以比较两个对象。 "" operator returns true if both references (objects) points to…

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、经…

String.valueOf()

1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下列几种 String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串 String.valueOf(char c) : 将 char 变量 c 转换成…

emacs gdb 调试

写下linux下用emacs调用dgb调试的方法 emacs中使用gdb 说明C等价于ctrl M等价于alt 1,编写 .c函数 test.c 2&#xff0c;gcc一把 看看对不对 带上-g gcc -g -o test .debug test.c 如果要用gdb调试器&#xff0c;必须使用g选项。 3&#xff0c;#ema…

第十九章 趣味编程

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