Android网络缓存的实现思路

在开发群里有多位同学问到了关于Android中网络缓存的问题。事实上不管是Android还是iOS,缓存的大致思路都是同样的,以下就几种情况下的缓存做一个大致的介绍。顺便说一下有些开源的网络请求框架已经提供了对缓存的支持。比如如今比較流行的okhttp。但是有的时候我们希望利用Android自带的网络请求api而且实现自己的网络缓存策略。自己实现会更加灵活,更符合自己的 业务逻辑需求。

我把网络缓存大致先分为两种:

1、网络数据刷新不频繁的

在此种情况下网络数据数据的频率并非非常高,而且对数据的实时显示要求也不是非常高,比如一些电商平台的商品显示列表数据。在这样的情况下。数据比方每过1个小时才刷新一次,这样我们就不是必需每次都去从网络上请求数据,可给数据设置一个超时值,当然这个超时值应该小于数据刷新的时间。比如假设数据刷新是1小时一次。那么我们能够把缓存的超时值设置成30分钟。10分钟,或者5分钟。这样就会既能够保证数据的高速显示又不会影响用户获得最新的数据。在这样的情况下的业务逻辑例如以下:

if(网络可用){
	if(本地存在相应缓存&&缓存没有过期&&非刷新操作){
	返回本地;
	}else{
	进行网络请求;
	存储网络数据到本地;//(能够使用文件或sqllite)
	返回网络数据。
	}
}else{
	if(刷新操作){
	提示无网络状态下刷新操作不可用;
	}else{
		if(本地存在相应缓存){
		返回本地缓存
		}else{
		返回空。
		}
	}
}

2、网络数据刷新较频繁的

假设网络数据刷新较为频繁,比方贴吧,说说什么的。就不能用上面所说的缓存机制,由于这样的对数据的实时性要求比較高,这样的情况下所须要的缓存机制也不过略微改善一下用户的使用体验,让用户刚刚进来的时候有内容能够看。这样的情况下的缓存逻辑例如以下:

if(网络可用){
	if(本地存在相应缓存){
	在界面中先设置本地数据;
	}
	发出网络请求。
	网络请求数据存储到本地。
	等网络请求结束用新的数据刷新界面。
}else{
	if(本地存在相应缓存){
	在界面中设置本地数据。
	}else{
	界面中提示没有数据。或者网络不可用。
	}
}

以上就是较为经常使用的网络缓存的两种实现思路。另外要说明的就是把网络数据存储到本地的详细技术。能够使用sqllite进行存储,也能够使用文件进行存储。假设使用文件存储建议建立一个目录,而且以每一个url相应的hashcode码为文件名称,这样存储比較清晰,而且计算超时值时能够直接用当前时间减去文件的改动时间就能够了,假设是用sqllite数据库存储,存储的时候应该存储相应的url,时间戳,和内容。

如有不妥欢迎拍砖。


原文地址:https://www.cnblogs.com/mfmdaoyou/p/7352764.html