前一篇文章:开发一个好项目:五、创建数据源,创建网络数据Service和网络数据源 框架地址 dileber android框架 希望大家能多多star一下
如下是BaseRepository 包含有三个常用属性
localDataSource 本地源
remoteDataSource 网络源
cache 缓存 缓存的开启,与项目代码的的状态有关系,如果 BaseConfiger 类中的bug设置为true 缓存则不开启,当设置为false的时候,缓存将开启。refCache 则是是否刷新缓存的标识
还有三个方法
refOver 刷新结束
refStart 刷新开始 每次调用完后必须再调用结束。
isRefCache 是否刷新
protected T1 localDataSource = null;
protected T2 remoteDataSource = null;
protected Map<String,Object> cache = null;
/**
* 是否刷新缓存
*/
private boolean refCache = false;
public void refOver(){
refCache = false;
}
public void refStart(){
refCache = true;
}
public boolean isRefCache(){
return refCache;
}
如下便是SysRepository 主要代码
如果想要做内存缓存的话(缓存会提高效率)
if(cache==null){
cache = new HashMap<>();
}
cache.put(LAUNCH,launchModel);
如果想做文件缓存的话,就会采用两种,一种是,shareprefer,另外一种是数据库,当然数据库的缓存和shareprefer的缓存都在本地数据源处理了,我们只需要做的是,如何取到。 这个的应用场景很常见(我举例子说明一下:微博类应用,你打开微博应用的时候有时候不联网,微博应用出来的是你最后一次浏览的数据。)
如何实现呢?就要在数据仓库里进行操作了:
如下代码逻辑解释:如果本地数据源里有数据则从本地数据源获取数据,如果没有的话,才从网络获取。当从网络获取到的时候,再把本地数据源的数据更新,或者添加。你的应用在没有联网的时候就也可以获取数据了,当然如果要是想刷新数据的话就要用到 :
refOver 刷新结束
refStart 刷新开始
两个方法了
localDataSource.getLaunch(new BaseDataSource.BaseCallback<LaunchModel>() {
@Override
public void onSuccess(LaunchModel launchModel) {
saveLaunch(launchModel);
callback.onSuccess(launchModel);
}
@Override
public void onFailure(DataSourceException e) {
remoteDataSource.getLaunch(new BaseCallback<LaunchModel>() {
@Override
public void onSuccess(LaunchModel launchModel) {
saveLaunch(launchModel);
callback.onSuccess(launchModel);
}
@Override
public void onFailure(DataSourceException e) {
callback.onFailure(e);
}
});
}
});
}
总代码:
public class SysRepository extends BaseRepository<SysLocalDataSource,SysRemoteDataSource> implements SysDataSource{
protected SysRepository(SysLocalDataSource localDataSource, SysRemoteDataSource remoteDataSource) {
super(localDataSource, remoteDataSource);
}
public static volatile SysRepository instance;
public static SysRepository getInstance() {
if (instance == null) {
synchronized (SysRepository.class) {
if (instance == null) {
instance = new SysRepository(SysLocalDataSource.getInstance(), SysRemoteDataSource.getInstance());
}
}
}
return instance;
}
@Override
public void launch(BaseDataSource.BaseCallback<LaunchWrapper> callback) {
remoteDataSource.launch(callback);
}
private static final String LAUNCH = "launch";
@Override
public void saveLaunch(LaunchModel launchModel) {
if(cache==null){
cache = new HashMap<>();
}
cache.put(LAUNCH,launchModel);
localDataSource.saveLaunch(launchModel);
}
@Override
public void getLaunch(final BaseDataSource.BaseCallback<LaunchModel> callback) {
if(cache!=null&&cache.containsKey(LAUNCH)){
callback.onSuccess((LaunchModel) cache.get(LAUNCH));
}else{
localDataSource.getLaunch(new BaseDataSource.BaseCallback<LaunchModel>() {
@Override
public void onSuccess(LaunchModel launchModel) {
saveLaunch(launchModel);
callback.onSuccess(launchModel);
}
@Override
public void onFailure(DataSourceException e) {
remoteDataSource.getLaunch(new BaseCallback<LaunchModel>() {
@Override
public void onSuccess(LaunchModel launchModel) {
saveLaunch(launchModel);
callback.onSuccess(launchModel);
}
@Override
public void onFailure(DataSourceException e) {
callback.onFailure(e);
}
});
}
});
}
}