Android简单实现 缓存数据
来源:互联网 发布:知乐小说作品集百度云 编辑:程序博客网 时间:2024/05/16 12:06
前言
1、每一种要缓存的数据都是有对应的versionCode,通过versionCode请求网络获取是否需要更新
2、提前将要缓存的数据放入assets文件夹中,打包上线。
缓存设计
代码实现
/** * 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();//实现缓存
阅读全文
0 0
- Android简单实现 缓存数据
- Android 简单实现缓存机制
- Android --- 简单实现三级缓存
- Android 实现数据缓存机制
- Android数据缓存的实现
- C语言简单数据缓存实现
- 简单实现Android图片三级缓存机制
- 简单实现Android图片三级缓存机制
- Android WebView 实现缓存网页数据
- Android WebView 实现缓存网页数据
- Android WebView 实现缓存网页数据
- Android中简单轻量级的数据缓存类库DCache
- 简单缓存实现
- 简单缓存的实现
- 缓存池-简单实现
- 简单实现本地缓存
- map实现简单缓存
- Android 简单实现缓存机制(反射和数据库)
- mybatis解决字段名与实体类属性名不相同的冲突
- 通过 jQuery,对 CSS 元素进行操作。
- 命名函数表达式笨拙的作用域
- 深度拷贝和浅度拷贝
- jQuery中Ajax调用后台接口
- Android简单实现 缓存数据
- Android drawable layer-list
- 13-service简介
- 【递归入门】全排列
- oracle 使用flashback(闪回)恢复误删除的数据 或 误删除的表
- 百练_2810:完美立方
- 用SPFA解决差分约束问题(推荐)
- python组合数据类型--元组,字典
- AOP