###1. 概述程序员
在Android开发中咱们常常要进行各类网络访问,好比查看各种新闻、查看各类图片。但有一种情形就是咱们在规定的时间内每次重复发送的网络请求其实返回的数据可能都是同样的。好比一个电影类APP,每一次向服务器申请某个电影的相关信息,如封面、简介、演员表等等,它们的信息都是同样的,这样就有点浪费资源,最主要的是这些重复的请求产生了没有必要的流量。流量、流量、流量!!!重要的事情说三遍!而流量是要付费的,并且超贵,公司那么小,一个月要支付宽带运营商巨额的流量费用。因此领导们都千方百计地要节省带宽,其实这在整个软件开发中随时可见,解决的通常套路都是把重复请求的数据缓存在本地,并设置超时时间,在规定时间内,客户端再也不向远程请求数据,而是直接从本地缓存中取数据。这样一来提升了响应速度,二来节省了网络带宽(也就是节省了钱)。数据库
全部分享大纲:2017Android进阶之路与你同行设计模式
视频讲解地址:http://pan.baidu.com/s/1pLM1X3t
###2. 缓存的分类浏览器
2.1 服务端缓存缓存
常见的服务端有Ngix和Apache。服务端缓存又分为代理服务器缓存和反向代理服务器缓存。常见的CDN就是服务器缓存。这个好理解,当浏览器重复访问一张图片地址时,CDN会判断这个请求有没有缓存,若是有的话就直接返回这个缓存的请求回复,而再也不须要让请求到达真正的服务地址,这么作的目的是减轻服务端的运算压力。bash
2.2 客户端缓存服务器
客户端主要指浏览器(如IE、Chrome等),固然包括咱们的前面所讲的OkHttpClient.客户端第一次请求网络时,服务器返回回复信息。若是数据正常的话,客户端缓存在本地的缓存目录。当客户端再次访问同一个地址时,客户端会检测本地有没有缓存,若是有缓存的话,数据是有没有过时,若是没有过时的话则直接运用缓存内容,声明一下这是通常套路。markdown
###3. 第三方网络缓存分析网络
服务器的缓存处理对于咱们来讲是能够不用关心的,只须要关心客户端的请求缓存处理,咱们来看一下第三方的网络框架的处理方式,我就直接拿Okhttp为例吧,原理就是咱们上面所讲的显而易见,你也能够自行看Okhttp的源代码,这里我直接上张流程图:app
###3. 特有的缓存场景
上面所说的针对大部分app是没有任何问题的,咱们在开发中能够直接使用第三方的网络开源框架自带的缓存,可是内涵段子这个项目比较奇葩,由于内容更新比较频繁咱们要确保每次获取的数据都是最新的,因此咱们必须每次请求都要访问最新数据,这对于咱们来讲第三方的网络缓存框架然并卵,咱们须要按需定制。 既然如此咱们须要使用本身的缓存逻辑,那么大体的逻辑是咱们每次请求以前都会去本地缓存拿,若是本地有先拿过来显示确保用户体验,而后去服务器上获取数据若是获取的数据不同,那么从新刷新界面并将获取到的数据加入缓存,若是获取的数据和缓存里面的一致那么什么都不作。
讲到这里咱们必须了解一下数据库了,由于我打算把数据缓存到数据库中,那咱们上网找找第三方的开源数据库吧。ORMLite,GreenDao,DB4O,Perst,Litepal 等等,这个时候问题又来了,咱们第三方的数据库通常都是缓存在data/data/包名/database下面,这样一来若是缓存的数据比较多,多少有点对不住人家。因此咱们打算把数据库放到内存卡中,这样的话你多一点就多一点,并且若是手抖卸载了内涵段子而后发现仍是忘不了里面的某个女主播你懂的,这个时候从新装上app的时候咱们的缓存数据库也都还在。你也能够看到本身的内存卡中有不少的数据库,那些都是某些app特地写到外部存储卡的。
###3. 数据库动员大会
各位同事各位精英,为了咱们公司的明天,你们做为核心的程序员我但愿大家必须对大家用的东西了如指掌,否则出了bug就很是的麻烦了。直接使用别人的是初级,看完了会模仿着写一个是中级,本身按照需求来写一个框架就是高级。你们必定要努力好好学习好好提高本身的能力,今天每人先领一台Iphone7,只要国家公务员的工资涨了,我必定给大家涨工资。说得好听,我要是老板也这样反正有钱就是爷。
有了这个接下来我就上一段代码:
/** * Created by Darren on 2017/2/28. * Email: 240336124@qq.com * Description: 工厂设计模式 IDaoSupport的工厂 */ public class DaoSupportFactory { public static DaoSupportFactory mFactory; // 数据库SQLiteDatabase private SQLiteDatabase mDatabase; public DaoSupportFactory() { File databaseDir = new File(Environment.getExternalStorageDirectory() + File.separator + "nhdz" + File.separator + "database"); if (!databaseDir.exists()) { databaseDir.mkdirs(); } // 数据库放在外部存储卡下面 nhdz/database/nhdz.db File dataBaseFile = new File(databaseDir, "nhdz.db"); mDatabase = SQLiteDatabase.openOrCreateDatabase(dataBaseFile, null); } /** * 获取DaoSupportFactory实例 * * @return */ public static DaoSupportFactory getFactory() { if (mFactory == null) { synchronized (DaoSupportFactory.class) { if (mFactory == null) { mFactory = new DaoSupportFactory(); } } } return mFactory; } /** * 获取IDaoSupport */ public <T> IDaoSupport<T> getDaoSupport(Class<T> clazz) { IDaoSupport<T> daoSupport = new DaoSupport<>(); // 初始化数据 daoSupport.init(mDatabase, clazz); return daoSupport; } } 复制代码
再看看使用方式:
// 直接从工厂里面获取 IDaoSupport<Person> daoSupport = DaoSupportFactory.getFactory().getDaoSupport(Person.class); // 插入数据对象 daoSupport.insert(new Person("Darren", 23)); 复制代码
全部分享大纲:2017Android进阶之路与你同行
视频讲解地址:http://pan.baidu.com/s/1pLM1X3t