平时我们开发一个Android客户端的时候,谈到缓存处理更多的是关于图片的缓存,其实我们在开发类似于新闻客户端的时候,还需要考虑数据的缓存处理。通过数据的缓存处理,我们可以减少服务端的压力,减少用户的流量消耗。
实现的方式主要是将客户端调用接口获取的列表数据缓存到相应目录下,以文件的形式保存下来,当下次进入界面,首先去缓存目录下找缓存文件,如果没有缓存文件,则直接调用网络接口去服务端获取;如果有缓存文件,还需要判断缓存文件的有效期,如果过了有效期,还是需要调用网络接口去获取最新的数据,拿到最新数据显示在界面并替换当前的缓存文件;如果没有过有效期,则直接拿出缓存文件的数据显示。
下面是缓存数据处理的几个函数:
//保存数据至缓存文件 public boolean saveObject(Serializable ser, String file) { FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = sContext.openFileOutput(file, Context.MODE_PRIVATE); oos = new ObjectOutputStream(fos); oos.writeObject(ser); oos.flush(); return true; } catch (Exception e) { // e.printStackTrace(); return false; } finally { try { oos.close(); } catch (Exception e) { } try { fos.close(); } catch (Exception e) { } } } //判断指定缓存文件是否存在 public boolean isExistDataCache(String cachefile) { boolean exist = false; File data = sContext.getFileStreamPath(cachefile); if (data.exists()) exist = true; return exist; } private boolean isReadDataCache(String cachefile) { return readObject(cachefile) != null; } //判断缓存文件是否过了有效期 public boolean isCacheDataFailure(String cachefile, int time) { boolean failure = false; if (!isReadDataCache(cachefile)) { failure = true; } else { File data = sContext.getFileStreamPath(cachefile); if (data.exists() && ((System.currentTimeMillis() - data.lastModified()) > time || (System .currentTimeMillis() - data.lastModified()) < 0)) failure = true; else if (!data.exists()) failure = true; } return failure; } //读取指定缓存文件 public Serializable readObject(String file) { if (!isExistDataCache(file)) return null; FileInputStream fis = null; ObjectInputStream ois = null; try { fis = sContext.openFileInput(file); ois = new ObjectInputStream(fis); return (Serializable) ois.readObject(); } catch (FileNotFoundException e) { return null; } catch (Exception e) { // e.printStackTrace(); if (e instanceof InvalidClassException) { File data = sContext.getFileStreamPath(file); data.delete(); } return null; } finally { try { ois.close(); } catch (Exception e) { } try { fis.close(); } catch (Exception e) { } } } //清除指定缓存文件 public boolean clearFileCache(String filecache) { boolean ret = false; if (isExistDataCache(filecache)) { File file = sContext.getFileStreamPath(filecache); file.delete(); ret = true; } return ret; }
通过上面的代码可以发现,数据是缓存在你应用目录的files文件下,也就是data/data/packageName/files/
使用方式:
1、读取缓存,并判断根据缓存来判断是否需要调用网络接口
//读取缓存文件 Serializable object = AppState.getInstance().readObject(SystemConfig.KEY_HISTORY); if (object == null) {//不存在缓存文件 if (AppState.getInstance().isNetworkConnected()) { //网络状态好的情况下直接调用接口获取数据 startHistory(); } else { showFailLayout(); } } else { if (AppState.getInstance().isCacheDataFailure(SystemConfig.KEY_HISTORY, SystemConfig.CACHE_TIME)) {//缓存文件过了有效期(20分钟) if (AppState.getInstance().isNetworkConnected()) { startHistory(); } else { showFailLayout(); } } else { //获取缓存数据并显示 mList = (ArrayList<TodayHistory>) object; mHandler.sendEmptyMessage(1); } }
2、调用网络接口获取数据之后,显示并保存到缓存文件中
if (mList.size() > 0) AppState.getInstance().saveObject(mList, SystemConfig.KEY_HISTORY); mHandler.sendEmptyMessage(1);
注意:保存到缓存文件的数据类型必须实现Serializable接口,因为读取和保存数据都是通过IO操作的。
欢迎去下载我的软件体验:http://android.myapp.com/myapp/detail.htm?apkName=com.yln.history
相关推荐
android缓存处理的小例子,可以应用于其他任何想要解决缓存处理的android程序
AndroidStudio开发平台。通过url加载显示图片资源,加载过程中进行了缓存和分页加载的优化。同时对当前视图中不可见的图片资源进行了回收处理。
Android状态保存、用户偏好设置保存、通过universal_image_loder网络加载图片并做图片缓存处理Demo 1、将universal-image-loder...jar包放入项目的libs文件里,并引入。 2、将MyApplication.java类放入项目,具体...
数据缓存的一个工具类,方便攻城狮对一些基本数据类型进行数据缓存,特别还加了对集合的缓存,更加方便对app数据处理
这是一个专用于解决Android中网络请求及图片加载的缓存处理框架 项目目标 本项目是作为实验项目,不保证其稳定性及可靠性 因为缓存业务的复杂性,本项目尽可能适应更多的使用场景 目前考虑到的,会实现的功能清单,...
google建议使用getExternalCacheDir()缓存存储默认存储位置为app数据缓存位置为处理防止被删除,在数据库文件夹下创建cachemanage文件夹,数据存储在该文件夹下支持文件加密存储默认des3加密内容默认生成des3唯一...
该框架或者说库,主要是用于本地的图片缓存处理。 数据的存入 当你取到图片的元数据,会将数据存入硬盘缓存以及内存缓存中。 数据的获取 取数据的时候,先从内存缓存中取; 如果没有取到,则从硬盘缓存中取(此时...
具体来说,MediaCodec在编解码的过程中使用了一组输入/输出缓存区来同步或异步处理数据:首先,客户端向获取到的编解码器输入缓存区写入要编解码的数据并将其提交给编解码器,待编解码器处理完毕后将其转存到编码器...
请求网络数据是在安卓开发中使用最频繁的一个功能,网络请求的体验决定了用户对整个APP的感觉,因此合理地使用缓存对网络请求的数据进行处理极为重要。合理的进行缓存和网络请求,可以为APP带来更优秀的体验。图片的...
使用java语言,接收mqtt传输来的数据,并进行保存,里面包含所需的jar包
这些模型为您提供了一个类型安全的api来处理graphql服务器。Apollo将帮助您保持GraphQL查询语句在一起、有组织且易于从Java访问。更改查询并重新编译项目-Apollo代码生成器将重建数据模型。代码生成还允许Apollo从...
针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也...
关于Retrofit+OkHttp的强大...缓存处理还是很有必要的,它有效的减少服务器负荷,降低延迟提升用户体验,同时也方便用户即使在没网络的情况下也能使用APP。 之前一直有一个疑惑,既然Retrofit已经是对OkHttp的一个封
通过本文带大家一起看过UIL这个国内外大牛都追捧的图片缓存类库的缓存处理机制。看了UIL中的缓存实现,才发现其实这个东西不难,没有太多的进程调度,没有各种内存读取控制机制、没有各种异常处理。反正UIL中不单...
编解码器处理完这些数据并将处理结果输出至一个空的输出缓存(output buffer)中。最终,你请求或接收到一个填充了结果数据的输出缓存(output buffer),使用完其中的数据,并将其释放给编解码器再次使用。
5:先执行缓存数据后执行请求数据 (缓存性能) 6:使用状态模式 观察者模式更好的处理多线程 最初的想法:网络优化开发框架 (移除任务未完成) 网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性 ...
Fi、Bluetooth、NFC等网络模块的编程,讨论了Android中线程、数据存取、消息缓存、界面更新等的处理方法,探讨了SIP、XMPP等协议在Android上的应用;源码分析篇(第9~11章)分析了Android中与HTML处理、网络处理以及...
android中使用网口打印机(通过ip地址和端口号进行连接),通用型,经测试可以在佳博,钻木,芯烨打印机上通用,采用ESC/POS指令。有效的设置了打印机连接异常的处理,和打印缓存的处理
4)对请求的数据根据URL进行缓存到本地sqlite数据库中(我刚刚想起了 post请求的时候需要对缓存url及本地数据存取做修改才可以正常用 如果不想进行修改可以用get形式) 5)本demo可以直接运行 本来想测试protobuf...
针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也...